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。