2016-05-18 3 views
3

Я пытаюсь отключить загрузку ссылок внутри wkWebView, поэтому я использую decidePolicyForNavigationAction для этого, но мое приложение дает мне эту ошибку:NSInternalInconsistencyException: WebView: decidePolicyForNavigationAction: decisionHandler не был назван

Terminating app due to uncaught exception 'NSInternalInconsistencyException' reason: 'Completion handler passed to -[ViewController webView:decidePolicyForNavigationAction:decisionHandler:] was not called'

Этот является упрощенный код, который дает мне эту ошибку:

import UIKit 
import WebKit 

class ViewController: UIViewController, WKNavigationDelegate { 

    var webView: WKWebView 

    required init?(coder aDecoder: NSCoder) { 
     let config = WKWebViewConfiguration() 
     self.webView = WKWebView(frame: CGRectZero, configuration: config) 
     super.init(coder: aDecoder) 
     self.webView.navigationDelegate = self 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     view.insertSubview(webView, atIndex: 1) 
     webView.translatesAutoresizingMaskIntoConstraints = false 
     let height = NSLayoutConstraint(item: webView, attribute: .Height, relatedBy: .Equal, toItem: view, attribute: .Height, multiplier: 1, constant: -44) 
     let width = NSLayoutConstraint(item: webView, attribute: .Width, relatedBy: .Equal, toItem: view, attribute: .Width, multiplier: 1, constant: 0) 
     view.addConstraints([height, width]) 


     webView.loadRequest(NSURLRequest(URL:NSURL(string:"https://www.apple.com")!)) 


    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

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

     if (navigationAction.navigationType == WKNavigationType.LinkActivated){ 
      print(navigationAction.request.URL?.relativeString) 
      decisionHandler(WKNavigationActionPolicy.Cancel) 
     } 
    } 
} 
+0

Я предполагаю, что здесь, но это выглядит, как вы ** сусло ** call solutionHandler, независимо от вашего решения. Попробуйте добавить 'else {decisionHandler (WKNavigationActionPolicy.Allow)}' в конец вашего метода делегата. –

ответ

10

Вы должны вызвать decisionHanler для каждого случая.

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) { 
    if (navigationAction.navigationType == .LinkActivated){ 
     decisionHandler(.Cancel) 
    } else { 
     decisionHandler(.Allow) 
    } 
} 
1

это означает, что если вы звоните decidePolicyForNavigationAction, вы можете вызвать только decisionHandler(XX)сразу одновременно. В противном случае приложение будет сбой может произойти около NSInternalInconsistencyException: webView:decidePolicyForNavigationAction:decisionHandler was not called

(1) быстрое

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) { 
    if (custom condition){ 
     decisionHandler(XX) // if... return as well 
    } else { 
     decisionHandler(XX) 
    } 
} 

(2) OC

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { 

    NSString *url = [navigationAction.request.URL absoluteString]; 
    url = [url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

    if ([url rangeOfString:@"xxxx://"].location != NSNotFound) { 
     // custom fundation 
     decisionHandler(WKNavigationActionPolicyCancel); 
     return; // the same as to use if...else 
    } 
    decisionHandler(WKNavigationActionPolicyAllow); 

} 
Смежные вопросы