Когда я нажимаю на панель UINavigation во время загрузки веб-просмотра, мое приложение вылетает?

У меня есть представление с панелью навигации в моем приложении для iphone. На панели навигации есть кнопка «Назад», чтобы вернуться к предыдущему виду. В представлении находится веб-просмотр. Если веб-представление загружается, когда пользователь нажимает кнопку «Назад» на панели навигации, приложение аварийно завершает работу с сообщением об ошибке:

[WebViewController respondsToSelector:]: message sent to deallocated instance

Я предполагаю, что я выпускаю некоторые вещи, когда представление выгружается. Я считаю, что мой метод viewWillDisapear позаботится о том, чтобы остановить загрузку веб-просмотра... Но все же, когда я нажимаю назад, когда представление не полностью загружено, оно падает.

Кажется, это происходит, когда я позволяю представлению завершить загрузку примерно в 20% случаев - и только если я очень быстро нажимаю кнопку «Назад» после завершения загрузки страницы.

Вот код, который, как я полагаю, работает во время этих махинаций....:

- (void)viewDidLoad {
     [super viewDidLoad];
     webView.scalesPageToFit = YES;
    [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString: url]]];
    [addressBar setText:url];
}

а затем, когда веб-просмотр загружается:

- (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


person Rossi    schedule 17.08.2011    source источник


Ответы (3)


Вы можете переопределить -viewWillDisappear:, чтобы остановить загрузку UIWebView, и установить для делегата значение nil.

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.webView stopLoading];
    self.webView.delegate = nil;
}
person Mark Adams    schedule 17.08.2011

Это может быть связано с тем, что до того, как код выполнения, который вы написали в приложении viewwillDisapper, выйдет из строя. попробуйте поставить точку останова и проверить, вызывается ли метод viewwillDisapper или нет. контроллер просмотра.

person iosdev1111    schedule 10.02.2012

Вы должны убедиться, что для свойства delegate веб-представления установлено значение nil, прежде чем оно исчезнет. Сделайте это как в методах dealloc, так и в методах viewDidUnload, так как viewDidUnload не всегда вызывается перед Dealloc. Происходит следующее: после освобождения вашего контроллера представления веб-представление все еще имеет ссылку на свой адрес и пытается отправить ему сообщение (-respondsToSelector:).

- (void)dealloc {
    webView.delegate = nil;
   [super dealloc];
}

- (void)viewDidUnload {
    webView.delegate = nil;
    [super viewDidUnload];
}
person Mehmood    schedule 17.05.2013