iOS 5的UIWebview委托:WebKit在webView中放弃了未捕获的exception:decidePolicyForNavigationAction

我使用委托方法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做些什么吗? 我只是testing推不同的视图控制器,不包含webView ,它工作正常。

我通过确保以前在webview上的所有请求都已停止,然后继续:

 [webview stopLoading]; 

我完全不知道为什么我从Webkit中得到这个错误,但是我把它追溯到试图在一个带有零键的字典中插入一个值。

看看你是否在其控制器dealloc方法中取消了UIWebView的委托属性(当然如果这个控制器是webview的委托)。 喜欢这个:

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

从苹果文档上的代表财产 :

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

这个错误的另一个原因可能是Autolayout在包含webview的视图控制器中意外地保持启用状态。 这发生在我在iOS5上testing的时候。

以下对类似问题的回答为我解决了这个问题:
uiwebview加载本地html文件 – 奇怪的Webkit错误

我有一个类似的错误:

*** WebKit在webView中放弃了未捕获的exception:resolvePolicyForNavigationAction:frame:decisionListner:delegate: – 在popup窗口仍然可见时到达[UIPopoverController dealloc]。

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

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

显然,当程序退出时,pc正在被释放。 我改变了代码,使PC的财产和WebKit停止抱怨。