UIWebView: методы делегирования webViewDidStartLoad / webViewDidFinishLoad, не вызываемые при загрузке определенных URL-адресов - PullRequest
17 голосов
/ 03 декабря 2010

У меня есть базовый веб-браузер, использующий UIWebView. Я заметил, что для некоторых страниц не вызывается ни один из методов UIWebViewDelegate.

Пример страницы, на которой это происходит: http://www.youtube.com/user/google. Вот шаги по воспроизведению проблемы (убедитесь, что вы вставили NSLog вызовы в методы UIWebViewDelegate вашего контроллера):

  1. Загрузите вышеуказанный URL-адрес YouTube в UIWebView [обратите внимание, что здесь методы UIWebViewDelegate вызываются при загрузке страницы]
  2. Коснитесь категории «Загрузка» на странице
  3. Нажмите любое видео в этой категории [ проблема: обратите внимание, что загружена новая страница, но ни один из делегатов UIWebView не вызывается]

Я знаю, что это не проблема неправильной установки делегата UIWebView, поскольку методы делегата вызываются при загрузке других ссылок (например, если вы пытаетесь щелкнуть ссылку, которая выводит вас за пределы YouTube, вы заметите, как вызывается метод делегата).

Изначально я чувствовал, что это может быть потому, что страница загружается с использованием AJAX, который может не вызывать метод делегата. Но потом, когда я проверил Safari на iPhone, у него не было этой проблемы, поэтому, должно быть, это что-то на моей стороне.

Я также заметил, что у Three20 TTWebController точно такая же проблема, как и у меня.

Но проблема, которая возникает из-за этой проблемы, заключается в том, что без вызова методов делегата я не могу обновить пользовательский интерфейс, чтобы включить / отключить кнопки просмотра назад и вперед при загрузке новых запросов.

И идея, почему это происходит, или как я могу обойти это, чтобы обновить пользовательский интерфейс при создании нового запроса?

Ответы [ 3 ]

20 голосов
/ 10 января 2011

Это не ошибка iOS - страница на самом деле не перезагружается. Делегаты UIWebView запускаются после новых запросов страниц, но эта страница этого не делает.

Посмотрите очень внимательно на то, что происходит в настольном Safari, когда вы нажимаете ссылку на видео на этой странице, как вы описываете. Убедитесь, что вы обращаете внимание на адресную строку. Адрес изменится, , но критически страница не перезагрузится .

Все это обрабатывается JavaScript, а не путем перезагрузки страницы. Проще говоря, страница никогда не перезагружается, поэтому нет никаких причин для делегатов UIWebView называться .

Если вы мне не верите, чтобы окончательно доказать это, попробуйте повторить шаги, описанные вами, с отключенным JavaScript. Вы заметите, что страница ведет себя совершенно иначе.

1 голос
/ 31 января 2011

это не хорошее решение, но я использую NSTimer для обновления статуса кнопок:

- (BOOL)webView:(UIWebView *)_webview shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (!_timer && [request.URL.absoluteString rangeOfString:@"youtube.com"].length != 0) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:0.5
                                                  target:self
                                                selector:@selector(checkNavigationStatus)
                                                userInfo:nil
                                                 repeats:YES];
    }

    return YES;
}

//....
//....
//....

- (void)checkNavigationStatus
{
    // Check if we can go forward or back
    backButton.enabled = self.webView.canGoBack;
    forwardButton.enabled = self.webView.canGoForward;
}
0 голосов
/ 21 февраля 2011

Похоже, это было исправлено в iOS 4.2.Работает в iOS 4.2.

...