link 上的 WKWebView 点击侦听器?
WKWebView on link click listener?
WKWebView中是否存在类似onLinkClickListener的东西class?我尝试用谷歌搜索但一无所获,我还在类似类型的 Whosebug 上发现了一些未解决的问题。
我需要 linkClickListener 的原因是,当我点击 link 并且页面尚未加载时,它不会加载网站。当页面加载监听器时,我还可以创建一个奇特的加载屏幕。
你可以这样做
将 WKNavigationDelegate 添加到您的 class
class ViewController: UIViewController, WKNavigationDelegate
设置导航委托
yourWKWebview.navigationDelegate = self
之后您将能够使用 decidePolicyFor navigationAction 函数
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.navigationType == WKNavigationType.linkActivated {
print("link")
decisionHandler(WKNavigationActionPolicy.cancel)
return
}
print("no link")
decisionHandler(WKNavigationActionPolicy.allow)
}
这是您正在寻找的解决方案
来自 Bala 的原始答案:
创建 WkNavigationDelegate
到您的 class:
class ViewController: UIViewController, WKNavigationDelegate {
}
覆盖方法 loadView
并添加一个 observer
,如下所示:
override func loadView() {
webView = WKWebView()
webView.navigationDelegate = self
webView.addObserver(self, forKeyPath: "URL", options: [.new, .old], context: nil)
view = webView
}
在 viewDidLoad
添加一个 url 到你的 webView
.:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.setNavigationBarHidden(false, animated: true)
let url = URL(string: "https://www.hackingwithswift.com")!
webView.load(URLRequest(url: url))
webView.allowsBackForwardNavigationGestures = true
}
最后,最重要的是重写 observerValue
方法,如下所示:
override func observeValue(forKeyPath keyPath: String?, of object: Any?,
change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let newValue = change?[.newKey] as? Int, let oldValue = change?
[.oldKey] as? Int, newValue != oldValue {
//Value Changed
print(change?[.newKey] as Any)
}else{
//Value not Changed
print(change?[.oldKey] as Any)
}
}
这将打印您在加载 link 之前单击 webView 的 link。
WKWebView中是否存在类似onLinkClickListener的东西class?我尝试用谷歌搜索但一无所获,我还在类似类型的 Whosebug 上发现了一些未解决的问题。
我需要 linkClickListener 的原因是,当我点击 link 并且页面尚未加载时,它不会加载网站。当页面加载监听器时,我还可以创建一个奇特的加载屏幕。
你可以这样做
将 WKNavigationDelegate 添加到您的 class
class ViewController: UIViewController, WKNavigationDelegate
设置导航委托
yourWKWebview.navigationDelegate = self
之后您将能够使用 decidePolicyFor navigationAction 函数
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.navigationType == WKNavigationType.linkActivated {
print("link")
decisionHandler(WKNavigationActionPolicy.cancel)
return
}
print("no link")
decisionHandler(WKNavigationActionPolicy.allow)
}
这是您正在寻找的解决方案
来自 Bala 的原始答案:
创建 WkNavigationDelegate
到您的 class:
class ViewController: UIViewController, WKNavigationDelegate {
}
覆盖方法 loadView
并添加一个 observer
,如下所示:
override func loadView() {
webView = WKWebView()
webView.navigationDelegate = self
webView.addObserver(self, forKeyPath: "URL", options: [.new, .old], context: nil)
view = webView
}
在 viewDidLoad
添加一个 url 到你的 webView
.:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.setNavigationBarHidden(false, animated: true)
let url = URL(string: "https://www.hackingwithswift.com")!
webView.load(URLRequest(url: url))
webView.allowsBackForwardNavigationGestures = true
}
最后,最重要的是重写 observerValue
方法,如下所示:
override func observeValue(forKeyPath keyPath: String?, of object: Any?,
change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let newValue = change?[.newKey] as? Int, let oldValue = change?
[.oldKey] as? Int, newValue != oldValue {
//Value Changed
print(change?[.newKey] as Any)
}else{
//Value not Changed
print(change?[.oldKey] as Any)
}
}
这将打印您在加载 link 之前单击 webView 的 link。