2016-12-18 7 views
3

Gibt es eine Funktion für die WKWebView-Klasse, mit der Sie erkennen können, wann immer sich die URL dieses WebViews geändert hat?WKWebView-Funktion zum Erkennen, ob sich die URL geändert hat

Die Funktionen didCommit und didStartProvisionalNavigation scheinen nicht immer zu funktionieren, wenn mit bestimmten Elementen im WebView gearbeitet wird.

BEARBEITEN: Es wurde versucht, einen Benachrichtigungsbeobachter hinzuzufügen. Hier ist, was ich bisher:

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) 
+0

verwenden Sie Hash-Navigation? –

Antwort

5

Was meinst du damit, dass sie nicht immer zu feuern scheinen? Welche Art von Elementen? Sie müssen, damit das WkWebView funktioniert.

Ihre erste Hinweis darauf, dass die URL zu ändern versucht, ist in: 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 
} 

Bis Sie erhalten zu: didStartProvisionalNavigation Es hat sich geändert.

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

Alles, was Sie tun müssen, würde, ist diese Delegatmethoden umzusetzen (Swift) und das tun, was Sie wollen, wenn Sie es ändern zu sehen.

+0

Ich entschuldige mich für die späte Antwort, aber das hat perfekt funktioniert! Vielen Dank! –

+0

Was ist "__PRETTY_FUNCTION__"? Ich bin damit nicht vertraut. Außerdem, Matt - hast du den schnellen Code, der perfekt funktioniert hat? Ich habe Probleme, dies in swift 4 zu konvertieren – jbrown94305

0

Sie einen Beobachter hinzufügen können:

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

und die entsprechende Methode, die aufgerufen wird, wenn die URL ändert:

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

+0

Würdest du zufällig wissen, wie man Swift implementiert? Ich habe eine Benachrichtigung erstellt und sie meinem ursprünglichen Post hinzugefügt. Die Benachrichtigungssyntax in Swift ist ziemlich unterschiedlich und ich habe alle möglichen Versuche ausgeschöpft, zu denen ich fähig bin. Ich weiß nicht, wo ich von hier aus hingehen soll. –

Verwandte Themen