Повторное использование UIWebView вызывает сбои - PullRequest
6 голосов
/ 11 февраля 2012

Я читал, что повторное использование UIWebViews является плохой практикой.Некоторый код, который я унаследовал на работе, передает разнообразный контент в UIWebView.Powerpoints, документы Word и видео.Все это прекрасно работает в нормальных условиях.Когда мы слишком быстро отключаем контент в UIWebView, он выдает дамп.

Мой webView установлен как свойство.Он подключен в IB просто отлично.Обычный выбор из нашего tableView прекрасно загружает локальный контент.Требуется быстрый выбор огня из одной и той же ячейки или нескольких комбинаций, чтобы привести ее к краху.

Я могу записать некоторые сообщения об ошибках для webViewDidFailWithError.Но те сработают даже без сбоев.Вот локализованная строка ошибки.

The operation couldn’t be completed. (NSURLErrorDomain error -999.)

Когда приложение наконец-то аварийно завершает работу, оно взрывается из-за этой глупой ошибки WebCore.

Application Crash image

Если у кого-то естьлюбые ссылки или примеры кода, как справиться с этим, я был бы признателен.Может быть, пример того, как лучше всего использовать мое свойство webView, не взрывая вещи.

Я бы загрузил часть своего кода, но многое происходит, не связанное с самим webView.Весь контент, отправляемый в webView, выполняется через [self.webView loadRequest:request];, а запрос представляет собой NSURLRequest, заполненный путем к локальному контенту.

Я буду очень признателен, если кто-нибудь сможет мне помочь с этим.Пальцы скрещены за что-то простое.

Ответы [ 5 ]

2 голосов
/ 13 февраля 2012

Я не уверен, что этот способ - лучший способ решить проблему, но, похоже, он работает довольно хорошо. Короче, сладко, и это работает.

Я отключил userInteraction с tableView, который обновляет содержимое в webView. Так как вам приходится так сильно разбираться в нем, пропустить кран здесь или там, вероятно, не будет упущено. Итак, пока это исправление.

#pragma mark -
#pragma mark UIWebViewDelegate methods

-(void)webViewDidStartLoad:(UIWebView *)webView {
    [self.tableView setUserInteractionEnabled:NO];
}

-(void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.tableView setUserInteractionEnabled:YES];
}

// I re-enable on load failures as they can block you out entirely on fail
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    [self.tableView setUserInteractionEnabled:YES]; 
}
1 голос
/ 13 февраля 2012

Если сбой происходит только при быстром нажатии, можете ли вы надеть на него распознаватель жестов, чтобы он действовал как ограничитель скорости бедного человека?

0 голосов
/ 15 февраля 2012

Не могу помочь, но думаю, что вам лучше не использовать UIWebView повторно. Вычеркните перо, создайте его программно и установите для него значение nil и заново создайте / переназначьте / перераспределите его при изменении источника данных.

В другой заметке я бы использовал NSOperationQueue для загрузки данных.

0 голосов
/ 15 февраля 2012

В вашем UIWebViewDelegate вы можете реализовать webView:shouldStartLoadWithRequest:navigationType: для возврата NO, если загрузка запроса уже есть.

0 голосов
/ 11 февраля 2012

Используете ли вы [webview stopLoading]; перед загрузкой другого запроса? Вам может потребоваться отменить или остановить текущую загрузку, прежде чем пытаться загрузить другую. Другой вариант ограничивает ввод пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...