2017-06-07 11 views
4

タップしたリンクのURLをWKWebViewに取得したいとします。リンクは、アプリで特定のアクションを引き起こすカスタム形式です。例えばhttp://my-site/help#deeplink-intercom。私はそうのようなKVOを使用しています:リンクが初めてでタップされるとWKWebViewでリンクURLをタップする

override func loadView() { 
     let webConfiguration = WKWebViewConfiguration() 
     webView = WKWebView(frame: .zero, configuration: webConfiguration) 
     webView.navigationDelegate = self 
     webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil) 
     view = webView 
    } 

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
     if let newValue = change?[.newKey] { 
      print("url changed: \(newValue)") 
     } 
     print("Did tap!!") 
    } 

は、これは素晴らしい作品。しかし、同じリンクを2回タップするとリンクタップは報告されません(実際の値は変更されていないためです)。これを修正するための回避策がありますので、すべてのタップを検出してリンクを取得できますか?この上のポインタは素晴らしいでしょう!ありがとう!

答えて

3

変更addObserverobserveValue機能でこの

webView.addObserver(self, forKeyPath: "URL", options: [.new, .old], context: nil) 

ようにあなたは、あなたがデリゲートメソッドをWKWebView使用することができ、両方の値

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]) 
    }else{ 
     //Value not Changed 
     print(change?[.oldKey]) 
    } 
} 
+0

私が探していたもの!ご協力いただきありがとうございます! – Kex

5

をでき得ます。そして、Webviewデリゲートを自己に設定することを忘れないでください:webview.navigationDelegate = self

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) { 

    switch navigationAction.navigationType { 
     case .LinkActivated: 
     if navigationAction.targetFrame == nil { 
      self.webView?.loadRequest(navigationAction.request)// It will load that link in same WKWebView 
     } 
     default: 
      break 
    } 

    if let url = navigationAction.request.URL { 
     print(url.absoluteString) // It will give the selected link URL 

    } 
    decisionHandler(.Allow) 
} 
+1

このメソッドは呼び出されないため、これは機能しません。私がタップしているリンクはHTTPリクエストを発行しません。 – Kex

関連する問題