2016-09-23 2 views
1

habe ich eine Klasse mit dem Namen JSBridge, diese Klasse implementiert die WKNavigationDelegate, ich habe einige benutzerdefinierte Sachen in der Protokollverfahren, und dann eine andere UIViewController nennen s Standard WKNavigationDelegate zum Beispiel WebViewController aka webViewDelegate, so ich habe wie dieseswift 3 WKWebView Delegierte WKNavigationDelegate Mehrdeutige Methode

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

    //do something here then call `WebViewController`'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) -> 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) 
    } 
} 

mein Problem ist in xcode8 (swift3) der Compiler gibt mir den Fehler zu tun: Ambiguous use of 'webView(_:decidePolicyFor:decisionHandler:)', sie haben den gleichen Namen

Compiler

Antwort

1

Sie as verwenden kann man von einigen mehrdeutig Methoden zur Auswahl:

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

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

Eine andere Möglichkeit, diese Art von Situation zu behandeln ist "vermeiden, mit responds(to:) und verwenden Optional Verkettungs":

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

    if webViewDelegate.webView?(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler) == nil { 
     decisionHandler(.allow) 
    } 
} 

Der Rückgabetyp der Delegiertenmethode ist Void, daher ist das optionale verkettete Ergebnis vom Typ Void?. In Ihrem Fall wird es nur nil, wenn die optionale Methode nicht in der Instanz implementiert ist. Vergleichen Sie also das Ergebnis mit nil und prüfen Sie, ob die optionale Methode implementiert ist (und tatsächlich aufgerufen wird) oder nicht.

+0

Es funktioniert! Vielen Dank. – Ethan

Verwandte Themen