UIWebView didFinishLoading запускается несколько раз - PullRequest
52 голосов
/ 03 декабря 2009

У меня есть код, который нужно запустить после того, как a UIWebView закончит загрузку документа. Для этого я установил делегат UIWebView на свой контроллер и реализовал метод webViewDidFinishLoading.

Это вызывается несколько раз, в зависимости от типа загружаемой страницы. Я не уверен, что это из-за запросов ajax, запросов изображений или даже фреймов.

Есть ли способ сообщить, что основной запрос завершен, что означает, что HTML полностью загружен?

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

Ответы [ 9 ]

50 голосов
/ 04 декабря 2009

Вы можете сделать что-то подобное, чтобы проверить, когда загрузка будет завершена. Поскольку на одной странице может быть много контента, он вам нужен.

- (void)webViewDidFinishLoad:(UIWebView *)webview  {
    if (webview.isLoading)
        return;
    // do some work
}
48 голосов
/ 06 декабря 2009

Это может быть полезным (если вы еще не зашли так далеко) для NSLog трассировка загрузки начинается и заканчивается.

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
       NSLog(@"Loading: %@", [request URL]);
       return YES;
    }


    - (void)webViewDidFinishLoad:(UIWebView *)webView {
       NSLog(@"didFinish: %@; stillLoading: %@", [[webView request]URL],
            (webView.loading?@"YES":@"NO"));
    }


    - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
       NSLog(@"didFail: %@; stillLoading: %@", [[webView request]URL],
            (webView.loading?@"YES":@"NO"));
    }

Я только что посмотрел вызовы всех трех в одном из моих проектов, который загружает страницу справки из моего пакета и содержит встроенные ресурсы (внешние css, YUI !, изображения). Единственный запрос, который поступает - это начальная загрузка страницы, shouldStartLoadWithRequest не вызывается ни для одной из зависимостей. Поэтому любопытно, почему ваш didFinishLoad вызывается несколько раз.

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

12 голосов
/ 23 апреля 2014

Отметьте это так просто и легко, не нужно писать слишком много кода:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
        if ([[webView stringByEvaluatingJavaScriptFromString:@"document.readyState"] isEqualToString:@"complete"]) {
            // UIWebView object has fully loaded.
        }
    }
8 голосов
/ 24 марта 2013

Этот вопрос уже решен, но я вижу, что ему не хватает ответа, который фактически объясняет, почему несколько вызовов webViewDidFinishLoad на самом деле ожидаемое поведение

Вышеупомянутый метод вызывается каждый раз, когда веб-просмотр заканчивает загрузку фрейма. Из документации протокола UIWebViewDelegate :

webViewDidFinishLoad:
Отправляется после завершения загрузки веб-представления.

На самом деле, это также верно для всех других методов, составляющих протокол UIWebViewDelegate.

7 голосов
/ 06 февраля 2015

Попробуйте, это будет нормально работать

 -(void)webViewDidFinishLoad:(UIWebView *)webview  
    {
       if (webview.isLoading)
           return;
       else
       {
           // Use the code here which ever you need to run after webview loaded 
       }
    }
3 голосов
/ 08 июня 2016

Это происходит потому, что метод обратного вызова вызывается каждый раз, когда выполняется загрузка кадра. Чтобы предотвратить это, установите для свойства «suppressesIncrementalRendering» веб-просмотра значение true. это предотвратит рендеринг веб-просмотра, пока все данные не будут загружены в память. Это помогло мне

2 голосов
/ 26 августа 2012

Я заметил нечто похожее, и это было путаницей: у меня есть UITabBarController, кажется, он предварительно загружает все ViewControllers, связанные с его вкладками, при запуске приложения (несмотря на то, что отображается только first_Tab_ViewController), поэтому, когда несколько вкладок у ViewController с WebView вызываются соответствующие webViewDidFinishLoad и, если я скопировал, вставил:

NSLog(@"size width %0.0f height %0.0f", fitingSize.width, fittingSize.height); 

в нескольких я получаю несколько выводов в консоли, которые выглядят как двойные вызовы, когда они действительно являются одиночными вызовами в двух разных UIWebViews.

1 голос
/ 04 декабря 2009

Вы можете проверить свойства загрузки и запроса в методе webViewDidFinishLoad

0 голосов
/ 25 марта 2013

Возможно, с этой проблемой связано свойство UIWebView, представленное в iOS6: suppressesIncrementalRendering.

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