菜鸟教程小白 发表于 2022-12-12 12:07:44

ios - swift 3 WKWebView 委托(delegate) WKNavigationDelegate 模糊方法


                                            <p><p>我创建了一个名为<code>JSBridge</code>的类,这个类实现了<code>WKNavigationDelegate</code>,我在protocol方法中做了一些自定义的东西,然后调用另一个<code>UIViewController</code>的默认<code>WKNavigationDelegate</code>,例如<code>WebViewController</code>又名<code>webViewDelegate</code>,所以我必须这样做</p>

<pre><code>func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&gt; Void) {
    guard let webViewDelegate = webViewDelegate , self.webView == webView else {
      decisionHandler(.allow)
      return
    }

    //do something here then call `WebViewController`&#39;s implementation
    if webViewDelegate.responds(to: #selector(webViewDelegate.webView(_:decidePolicyFor:decisionHandler:))) {
            webViewDelegate.webView!(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler)
      } else {
            decisionHandler(.allow)
      }
}

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -&gt; Void) {
    guard let webViewDelegate = webViewDelegate , self.webView == webView else {
      decisionHandler(.allow)
      return
    }

    //do something here then
    if webViewDelegate.responds(to: #selector(webViewDelegate.webView(_:decidePolicyFor:decisionHandler:))) {
      webViewDelegate.webView!(webView, decidePolicyFor: navigationResponse, decisionHandler: decisionHandler)
    } else {
      decisionHandler(.allow)
    }
}
</code></pre>

<p>我的问题出在 xcode8(swift3) 中,编译器给了我错误:
   <code>'webView(_:decidePolicyFor:decisionHandler:)'的歧义使用</code>,它们与编译器同名</p>

<pre><code>func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -&gt; Void)
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&gt; Void)
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可以使用 <code>as</code> 从一些模棱两可的方法中选择一种:</p>

<pre><code>func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&gt; Void) {
    guard let webViewDelegate = webViewDelegate , self.webView == webView else {
      decisionHandler(.allow)
      return
    }

    typealias WKNavigationActionMethodType = (WKWebView,WKNavigationAction,@escaping(WKNavigationActionPolicy)-&gt;Void) -&gt; Void
    if webViewDelegate.responds(to: #selector(webView(_:decidePolicyFor:decisionHandler:) as WKNavigationActionMethodType)) {
      webViewDelegate.webView!(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler)
    } else {
      decisionHandler(.allow)
    }
}
</code></pre>

<hr/>

<p>另一种处理这种情况的方法是“避免使用 <code>responds(to:)</code> 并使用可选链接”:</p>

<pre><code>func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -&gt; Void) {
    guard let webViewDelegate = webViewDelegate , self.webView == webView else {
      decisionHandler(.allow)
      return
    }

    if webViewDelegate.webView?(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler) == nil {
      decisionHandler(.allow)
    }
}
</code></pre>

<p>委托(delegate)方法的返回类型是<code>Void</code>,所以它的Optional链结结果是<code>Void?</code>类型。在您的情况下,只有在实例中未实现可选方法时,它才会变为 <code>nil</code> 。因此,将结果与 <code>nil</code> 进行比较是在检查可选方法是否已实现(并实际调用)。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - swift 3 WKWebView 委托(delegate) WKNavigationDelegate 模糊方法,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39658358/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39658358/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - swift 3 WKWebView 委托(delegate) WKNavigationDelegate 模糊方法