Когда я нажимаю на панель UInavigation во время загрузки веб-просмотра, мое приложение вылетает ...? - PullRequest
2 голосов
/ 18 августа 2011

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

[WebViewController respondsToSelector:]: message sent to deallocated instance

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

Вот код, который, я считаю, работает во время этого shinanigans ....:

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

Ответы [ 3 ]

8 голосов
/ 18 августа 2011

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

0 голосов
/ 17 мая 2013

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

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

- (void)viewDidUnload {
    webView.delegate = nil;
    [super viewDidUnload];
}
0 голосов
/ 10 февраля 2012

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

...