当我在加载webview时按下我的导航栏时,我的应用程序崩溃了......?

时间:2011-08-17 21:56:53

标签: iphone uiwebview loading back

我的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

3 个答案:

答案 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];
}