我的iphone应用程序中有一个带导航栏的视图。导航栏上有一个后退按钮,可以显示上一个视图。在视图中是webview。如果在用户按导航栏上的后退按钮时加载webview,则应用程序崩溃并显示错误消息:
[WebViewController respondsToSelector:]: message sent to deallocated instance
我假设我在视图卸载时释放了一些东西。我相信我的viewWillDisapear方法负责停止加载webview ...但是,当我在视图未完全加载时按回来时,它会崩溃。
当我让视图在大约20%的时间内完成加载时似乎会发生这种情况 - 并且只有在页面完成加载后我才能快速按下后退按钮。
以下是我认为在此shinanigans中运行的代码....:
- (void)viewDidLoad {
[super viewDidLoad];
webView.scalesPageToFit = YES;
[webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString: url]]];
[addressBar setText:url];
}
然后加载webview时:
- (void)webViewDidStartLoad:(UIWebView *)webView {
if (first) {
//mtns is a uiimageview
mtns.alpha = .8;
first = NO;
}
[activityIndicator startAnimating];
}
并在提出建议后,我添加了这种方法:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.webView stopLoading];
self.webView.delegate = nil;
}
我不知道为什么会崩溃所以我有点不知所措
谢谢,
[R
答案 0 :(得分:8)
您可以覆盖-viewWillDisappear:
以停止加载UIWebView并将委托设置为nil。
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.webView stopLoading];
self.webView.delegate = nil;
}
答案 1 :(得分:0)
这可能是因为您在viewwillDisapper应用程序crashes.try中编写的执行代码之前放置了断点并检查是否调用了viewwillDisapper方法。如果未调用它,则在应用程序之前编写标记已建议的代码导航到第二个视图控制器。
答案 2 :(得分:0)
您必须确保将Web视图的委托属性设置为nil,然后才能消失。在 dealloc 和 viewDidUnload 方法中执行此操作,因为 viewDidUnload并非始终在dealloc 之前调用。发生的情况是,在取消分配视图控制器后,Web视图仍然会引用其地址,并尝试向其发送消息(-respondsToSelector :)。
- (void)dealloc {
webView.delegate = nil;
[super dealloc];
}
- (void)viewDidUnload {
webView.delegate = nil;
[super viewDidUnload];
}