2017-01-02 75 views
0

此处的目标是检测webView的URL何时更改。由于在处理WebView中的某些元素时,WKWebView类的didCommitdidStartProvisionalNavigation功能似乎并不总是被触发,所以我现在必须添加一个观察者来在WebView的URL值发生更改时进行拾取。无法将Obj-C观察器转换为Swift语法

到目前为止,我已经创建了自己的通知扩展与名checkURL

等均取得

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) 

Objective-C的解决方案(志愿)

// Add an observer 
[webView_ addObserver:self forKeyPath:@"URL" options:NSKeyValueObservingOptionNew context:NULL]; 

// Method that gets called when the URL value changes 
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { 
    // Code 
} 

将如何我着手应用该Objective-C代码来启动一个函数只要URL值改变?我仍然试图绕过通知以及它们如何处理对象值,所以任何解释都会非常有帮助!

谢谢您的阅读!

编辑:只是为了澄清事实,我将改写我的问题:

由于didCommitdidStartProvisionalNavigation并不总是显得与基于JavaScript的网站工作时,以及PHP火灾(尤其是 - 你会经常看到URL被改变的符号,如#和whatnot);然而,如前所述,内置的WKWebView函数似乎没有捕获这些函数。所以我在这里想要做的是找到一种解决方法来捕获对URL所做的任何更改,无论它是否只是一个#等。并且最好完全保留Swift代码 - 因为我仍在学习。 :)

+0

这是你必须effecti第三次vely问同样的问题。请你停下来。 – matt

回答

1

首先,原谅这个答案(相当一些)的假设,但我不能评论要求澄清。

二,我会建议给NSNotificationCenter reference一个很好的阅读。另外,如果我没有记错,关于通知的this writeup对我来说最初是非常有用的。

现在来看实际的代码。如果我理解你的困境(除了必须一起使用Objective-C和Swift,它总是......有趣),你试图通过URL更改发出通知,以便你的Swift代码可以使用新的URL 。

由于您的swift代码是正在监听的通知,因此您不希望将其发布到那里。相反,通知应在志愿回调张贴这样的:

// I have also changed the 'URL' to 'url' as I suspect that KVO is case-sensitive 
// and replaced NULL with nil as it is generally a better practice to use it. 
[webView_ addObserver:self forKeyPath:@"url" options:NSKeyValueObservingOptionNew context:nil]; 

// Method that gets called when the URL value changes 
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { 
    if (sender == webView_ && [keyPath isEqualToString:@"url"]) { 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"checkURL" object:self]; 
    } 
} 

这将通知发送到任何观察员,喜欢你的雨燕类。雨燕的代码将不得不改为类似:

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

// Notice that the call to post(name:object:) has been removed. 

// The 'object' parameter is only used for filtering out the sender of the notification. 
NotificationCenter.default.addObserver(self, selector: #selector(doSomething(notification:)), name: .checkURL, object: nil) 

// We can get the notification in the first parameter. 
func doSomething(notification: Notification) { 
    // Do something, like reading the URL from the web view. 
} 

现在,如果你做拥有在您的银行代码的网页流量的参考,你可以张贴通知时在用户信息参数传递值,像这样:

[[NSNotificationCenter defaultCenter] postNotificationName:@"checkURL" object:self userInfo:@{ @"url" : webView.url }]; 

然后你可以在通知回调读取用户信息:

func doSomething(notification: Notification) { 
    let url = notification.userInfo["url"] 
    // Do something with the url. 
} 
+0

感谢您的帮助!我目前正试图执行此操作。我也发现这个网站,这可能对于完全使用Swift(和零Objective-C)来实现一个解决方法很有用:http://tulusha.com/kvo-in-swift/ –

+0

啊,所以真正需要的是有这一切都迅速,只是从那里向任何需要它的人发出通知?这可以在问题中使用更多的说明,) – czaurel

+0

是的,正是如此。由于'didCommit'和'didStartProvisionalNavigation'似乎并不总是被触发(特别是在使用基于JavaScript的站点以及PHP时),您会经常看到URL被“#”等符号所改变)。然而,如前所述,内置的WKWebView函数似乎没有捕获这些函数。所以我在这里想要做的是找到一种解决方法来捕获对URL进行的任何修改,无论它是否只是一个'#'等等。 –

相关问题