UIWebView didFinishLoading se dispara varias veces

Tengo un código que debe ejecutarse después de que un UIWebView termine de cargar un documento. Para eso, he configurado el delegado de UIWebView en mi controller e implementado el método webViewDidFinishLoading .

Esto se llama varias veces, dependiendo del tipo de página a cargar. No estoy seguro de si se debe a requestes de ajax, requestes de imágenes o incluso iframes.

¿Hay alguna manera de decir que la request principal ha finalizado, lo que significa que el HTML está completamente cargado?

¿O tal vez retrasar el inicio de mi código hasta que todos los events terminen de disparar?

Podría ser esclarecedor (si aún no ha llegado tan lejos) a NSLog, un rastro de carga comienza y termina.

  - (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")); } 

Acabo de ver las llamadas a los tres en uno de mis proyectos que cargan una página de ayuda de mi package y contiene resources integrados (css externo, YUI !, imágenes). La única request que se shouldStartLoadWithRequest es la carga de la página inicial, no shouldStartLoadWithRequest llamar a shouldStartLoadWithRequest para ninguna de las dependencies. Entonces, es curioso por qué se llamó a yourFinishLoad varias veces.

Quizás lo que está viendo se debe a networkingirecciones, o como se mencionó, llamadas ajax dentro de una página cargada. Pero al less debería poder balancear llamadas a shouldStartLoad y a cualquiera de las otras dos funciones delegadas y poder determinar cuándo finalizó la carga.

Puede hacer algo como esto para comprobar cuándo finalizó la carga. Como puedes tener mucho contenido en la misma página, lo necesitas.

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

Compruebe esta de manera simple y sencilla para no tener que escribir demasiado código:

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

Esta pregunta ya está resuelta, pero veo que carece de una respuesta que realmente explique por qué las llamadas múltiples a webViewDidFinishLoad son en realidad comportamiento esperado

El método antes mencionado se invoca cada vez que la vista web termina de cargar un marco. De la documentation del protocolo UIWebViewDelegate :

webViewDidFinishLoad:
Enviado después de que una vista web termine de cargar un marco.

De hecho, esto también es cierto para todos los demás methods que comprenden el protocolo UIWebViewDelegate .

Prueba esto, funcionará bien

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

Esto sucede porque el método de callback se invoca cada vez que se carga un marco. Para evitar esto, establezca la propiedad "suppressesIncrementalRendering" de la vista web en true. esto evitará que la vista web se reproduzca hasta que se carguen todos los datos en la memory. Esto hizo el truco para mí

He notado algo similar y fue una confusión: tengo un UITabBarController , parece precargar todos los ViewControllers vinculados a sus tabs al iniciar la aplicación (a pesar de mostrar solo first_Tab_ViewController), por lo que cuando varias tabs tienen ViewController con WebView, sus respectivas webViewDidFinishLoad se llaman y si he copydo pegado:

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

en varios, obtengo varios resultados en la console que parece ser una llamada doble cuando realmente son llamadas únicas en dos UIWebViews diferentes.

Puede verificar las properties de carga y request en el método webViewDidFinishLoad

Posiblemente relacionado con este problema hay una propiedad en UIWebView introducida en iOS6: suprimeIncrementalRendering.