【问题标题】:WKWebView on link click listener?链接点击监听器上的 WKWebView?
【发布时间】:2018-02-25 11:59:57
【问题描述】:

WKWebView 类中是否存在类似 onLinkClickListener 的东西?我试着用谷歌搜索它,但什么也没找到,我还发现了一些关于类似类型的 stackoverflow 的未回答的问题。

我需要一个 linkClickListener 的原因是,当我点击一个链接并且页面还没有加载时,它不会加载网站。当页面与监听器一起加载时,我还可以创建一个精美的加载屏幕。

【问题讨论】:

  • 您查看过 WKNavigationDelegate 的文档吗?从您的问题来看,您似乎并不太关心检测点击(Javascript 用语中的 onClick),而是查看后续页面加载时发生的情况。 WKNavigationDelegate 的方法允许您跟踪这里发生的事情、响应身份验证挑战等。如果这是您需要的,请告诉我,我会发布答案。
  • @Sparky 我需要 clickListener,这样我就可以移动到前面一个漂亮的小加载视图,然后在页面加载时隐藏它,这将解决这个问题并使应用程序更好我认为。跨度>
  • 我明白你的意思,我认为 WKNavigation 代表可以为你做这件事。当您启动新页面加载时,显示您的进度指示器或您想要显示的任何内容,然后使用委托回调来显示加载进度(如果它是一个大页面),然后确认页面已成功加载。

标签: ios iphone swift swift3 wkwebview


【解决方案1】:

这是您正在寻找的解决方案

Bala 的原始答案:https://stackoverflow.com/a/44408807/8661382

为您的班级创建WkNavigationDelegate

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 中添加一个网址到您的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)
    }
    }

这将在加载链接之前打印您在 webView 上单击的链接。

【讨论】:

    【解决方案2】:

    你可以这样做

    将 WKNavigationDelegate 添加到您的课程中

    class ViewController: UIViewController, WKNavigationDelegate
    

    设置导航委托

    yourWKWebview.navigationDelegate = self
    

    之后你就可以使用decisionPolicyFor 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)
     }
    

    【讨论】:

      猜你喜欢
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多