In webView (_: entscheidendPolicyFor: entscheidungshandler :) wird es aufgerufen, wenn die erste Seite von WKWebView geladen wird oder wenn der Benutzer auf den Link tippt. Ich werde. Durch Zugriff auf WKNavigationAction können Sie daher die URLRequest abrufen und verarbeiten, ob die Seite geladen werden soll.
Warum ist der Titel ** die Lösung, wenn er nach dem Laden der Seite mit WKNavigationDelegate-entscheidend für die Navigation ** aufgerufen wird? Kann nur vor dem Laden und später in WebPage-Übergängen nach dem Laden der Seite aufgerufen werden
Wenn Sie beispielsweise zu einer YouTube-Videoseite wechseln, wird diese nach dem Laden der Seite aufgerufen, und Apple ruft sie vor dem Laden der Seite auf.
Der Grund, warum es nach dem Laden aufgerufen wird, ist wahrscheinlich, dass wenn die zu ladende URL eine relative URL ist, sie nicht vor dem Laden, sondern nach dem Laden der Seite aufgerufen wird.
Wenn Sie beispielsweise auf die YouTube-Videoseite tippen, wird diese vor dem Laden des Videos aufgerufen
python
import UIKit
import WebKit
class ViewController: UIViewController {
@IBOutlet weak var webView: WKWebView!
private var _observers = [NSKeyValueObservation]()
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
webView.load(URLRequest(url: URL(string:"https://www.youtube.com/")!))
_observers.append(webView.observe(\.url, options: [.new, .old]){ [weak self] _,change in
guard let newValue = change.newValue, let oldValue = change.oldValue else { return }
guard let newURL = newValue, let oldURL = oldValue else { return }
if newURL != oldURL {
//Ich möchte vor dem Laden mit Delegate sprechen. Reload nur, wenn die Seite nach dem Laden von Delegate aufgerufen wird
if newURL.absoluteString.contains("/watch"){
self?.webView.load(URLRequest(url: newURL))
}
}
})
}
}
extension ViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.allow)
}
}
Überprüfen Sie daher jedes Mal, wenn die webView-URL auf diese Weise geändert wird, die URL. Wenn sie sich von der alten unterscheidet (im Fall eines Seitenübergangs), laden Sie sie erneut mit einem absoluten Pfad und webView (_: entscheidendPolicyFor: entscheidungshandler :) Fang mit.
Jetzt funktioniert es wie beabsichtigt, aber es ist eine gewalttätige Lösung. Wenn Sie eine bessere Lösung kennen, würde ich mich freuen, wenn Sie einen Kommentar abgeben könnten.
Vielen Dank