【问题标题】:iOS 5 UIWebview Delegate: WebKit discarded an uncaught exception in the webView:decidePolicyForNavigationActioniOS 5 UIWebview 委托:WebKit 丢弃了 webView 中未捕获的异常:decidePolicyForNavigationAction
【发布时间】:2011-10-25 01:58:53
【问题描述】:

我正在使用委托方法 shouldStartLoadWithRequest 来捕获链接点击并处理我的应用程序中的特定情况,而不是允许 webView 导航到链接。在这段代码中,我试图将一个新的ViewController 推入堆栈。在尝试推送视图后,我立即在控制台中收到以下消息崩溃:

WebKit discarded an uncaught exception in the webView:decidePolicyForNavigationAction:request:frame:decisionListener: delegate:

我的代码如下所示:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if(decision logic){
        MyViewController *vc = [[MyViewController alloc] init];
        [self.navigationController pushViewController:vc animated:YES];
        [vc release];
        return NO;
    }

    return YES;
}

我也尝试过使用模式而不是推送新的viewController。我得到相同的结果。我应该在这里处理任何其他情况吗?

**编辑:刚想到这个。我试图推送的视图包含另一个UIWebView。我应该在过渡之前对第一个webView 做些什么吗?我只是测试推送一个不包含webView 的不同视图控制器,它工作正常。

【问题讨论】:

    标签: ios uiwebview


    【解决方案1】:

    我通过确保在继续之前停止 web 视图上的所有先前请求来解决此问题:

    [webview stopLoading];
    

    【讨论】:

    • 嗨,马克你接缝已经解决了子浏览器的问题,我只是想知道将 [webview stopLoading]; 放在哪里?我已经测试了几个没有运气的地方,你能告诉我把代码放在哪里吗?非常感谢!
    • 我试图将 [webView stopLoading] 放在 shouldStartLoadWithRequest 方法中,就在返回 NO 之前。这并没有解决我的问题。 @Mark:能否请您提供更多详细信息?
    • 我终于发现我的问题实际上是由于在推送的属于新视图控制器的部分代码中将数组元素设置为nil引起的,因此不是Web视图控制器的问题本身。
    【解决方案2】:

    我完全不知道为什么我会从 Webkit 收到此错误,但我将其追溯到尝试使用 nil 键在字典中插入值。

    【讨论】:

    • 这里有同样的问题;尝试使用 nil 键在字典中插入值会引发错误“WebKit 在 webView:decidePolicyForNavigationAction 中丢弃未捕获的异常”
    • 你在哪里插入了一个 nil 键?在委托方法中(如果是,是哪一个)?
    • 我不太确定,因为那是一年半前的事了,但据我的记忆,它是另一类完全不相关的字典。
    • 多么奇怪的错误!就我而言,我收到了警告WebKit discarded an uncaught exception in the webView:decidePolicyForNavigationAction:request:frame:decisionListener: delegate: <NSInvalidArgumentException> nil is not a valid predicate for filtering。看到这个答案后,我意识到有问题的谓词与 WebKit 无关。
    【解决方案3】:

    检查您是否在其控制器 dealloc 方法中取消 UIWebView 的委托属性(当然,如果此控制器是 webview 的委托)。像这样:

    - (void) viewDidLoad
    {
        webView.delegate = self;
    }
    - (void) dealloc
    {
        webView.delegate = nil;
    }
    

    来自delegate property 上的 Apple 文档:

    重要。在释放您已为其设置委托的 UIWebView 实例之前,您必须首先将其委托属性设置为 nil。例如,这可以在您的 dealloc 方法中完成。

    【讨论】:

    • 由于我使用的是 ARC,并且不允许使用 dealloc 方法,因此我尝试在 viewWillDisappear 中取消委托。
    • 不,这不是个好地方。 viewWillUnload 可能更好。否则,当弹出新的视图控制器时,代理将不再工作,从而返回到 Web 视图控制器。
    • Giorgio,你还是应该在ARC下使用你控制器的dealloc方法,只是不能调用[super dealloc]。至于 viewWillUnload,这个方法从 iOS6 开始就被弃用了:控制器根视图不再在内存不足的情况下被卸载。
    【解决方案4】:

    导致此错误的另一个原因可能是在包含 web 视图的视图控制器中意外启用了自动布局。 这发生在我在 iOS5 上测试时。

    【讨论】:

    • 自动布局会导致这个问题吗??
    【解决方案5】:

    我遇到了类似的错误:

    ***WebKit 在 webView:decidePolicyForNavigationAction:frame:decisionListner:delegate: - [UIPopoverController dealloc] 中丢弃了一个未捕获的异常,而 popover 仍然可见。

    问题似乎是由以下代码引起的:

    UIPopoverController *pc = [[UIPopoverController alloc] initWithContentViewController:vc];
    [pc presentPopoverFromRect:frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
    

    显然,当例程退出时,pc 正在被释放。我更改了代码以使 pc 成为属性,WebKit 停止抱怨。

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多