UIWebView didFinishLoading пожары несколько раз


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

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

есть ли способ сказать, что основной запрос завершен, то есть HTML полностью заряжен?

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

9 52

9 ответов:

это может быть поучительно (если вы еще не зашли так далеко) для 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 называется multiple раз.

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

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

- (void)webViewDidFinishLoad:(UIWebView *)webview  {
    if (webview.isLoading)
        return;
    // do some work
}

проверьте это так просто и простой способ добиться не нужно писать слишком много кода:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
        if ([[webView stringByEvaluatingJavaScriptFromString:@"document.readyState"] isEqualToString:@"complete"]) {
            // UIWebView object has fully loaded.
        }
    }

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

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

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

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

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

 -(void)webViewDidFinishLoad:(UIWebView *)webview  
    {
       if (webview.isLoading)
           return;
       else
       {
           // Use the code here which ever you need to run after webview loaded 
       }
    }

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

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

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

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

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

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