web-dev-qa-db-ja.com

URLが変更されたかどうかを検出するためのWKWebView関数

そのWebViewのURLが変更されたときはいつでも検出できるWKWebViewクラスの関数はありますか?

didCommitおよびdidStartProvisionalNavigation関数は、WebView内の特定の要素を操作するときに常に起動するとは限りません。

編集:通知オブザーバーを追加しようとしました。これが私がこれまでに持っているものです:

extension Notification.Name {
    static let checkURL = Notification.Name("checkURL")
}

NotificationCenter.default.post(name: .checkURL, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(getter: webView.url), name: .checkURL, object: webView.url)
6
Matt Swift

彼らはいつも発砲しているようには見えないというのはどういう意味ですか?どんな要素? WkWebViewが機能するためには、それらが必要です。

URLが変更しようとしていることを最初に示すのは、decidePolicyForNavigationActionです。

- (void) webView: (WKWebView *) webView decidePolicyForNavigationAction: (WKNavigationAction *) navigationAction decisionHandler: (void (^)(WKNavigationActionPolicy)) decisionHandler {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    decisionHandler(WKNavigationActionPolicyAllow); //Always allow
    NSURL *u1 = webView.URL;
    NSURL *u2 = navigationAction.request.URL; //If changing URLs this one will be different
}

次の場所にたどり着くまでに:didStartProvisionalNavigation変更されました。

- (void) webView: (WKWebView *) webView didStartProvisionalNavigation: (WKNavigation *) navigation {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    NSURL *u1 = webView.URL;  //By this time it's changed
}

あなたがしなければならないのは、これらのデリゲートメソッドを(Swiftで)実装し、それが変化したときにあなたが望むことをすることです。

7
hawkeyecoder

Swiftバージョン

// Add observer
webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil)

// Observe value
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if let key = change?[NSKeyValueChangeKey.newKey] {
        print("observeValue \(key)") // url value
    }
}
2
Atalyk

オブザーバーを追加できます。

_[webView_ addObserver:self forKeyPath:@"URL" options:NSKeyValueObservingOptionNew context:NULL];_

uRLが変更されたときに呼び出される対応するメソッド:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context

1
vomako