2010-05-14 11 views
7

En mi aplicación, necesito una forma de saber cuándo se terminó de cargar mi vista web. Es muy fácil hacer eso si el contenido es html. Sin embargo, mi fuente de contenido es javascript con iFrame adentro, causará que el método UIWebView finishedLoad sea llamado varias veces. ¿Hay alguna manera en que pueda verificar si el iframe está terminado de cargarse?Cómo determinar si iFrame terminó de cargarse en UIWebView

Respuesta

7

El único método infalible que he encontrado es escuchar los tres métodos que dicen que está a punto de comenzar a cargarse, y que terminó de cargarse (más el equivalente de "error") y mantener manualmente un conteo para cada uno.

decir algo como:

int outstandingRequests; 

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    outstandingRequests++; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    outstandingRequests--; 

    if(outstandingRequests < 1) 
    viewLoadingPleaseWait.hidden = TRUE; 
} 

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
{ 
    outstandingRequests--; 
} 

He también por lo general tenía que OVERRID el método didFail - Apple utiliza incorrectamente este para informar de que, por ejemplo, el reproductor de YouTube se hizo cargo del manejo de un video de YouTube. NO es un error, es una "página cargada por una aplicación diferente".

p. Ej.

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
{ 
    outstandingRequests--; 

    if([error code] == NSURLErrorCancelled) 
    { 
     NSLog(@"[%@] ...webView CANCELLED loading", [self class]); 
    } 
    else if([[error domain] isEqualToString:@"WebKitErrorDomain"] 
    && [error code] == 204) 
    { 
     // no worries ... YouTube, iCal, or etc took over the page load 
    } 
} 
+0

+1, muy útil, gracias! Solo un aviso, terminé incrementando el contador de peticiones pendientes en el método '- (void) webViewDidStartLoad: (UIWebView *) aWebView' porque el' shouldStartLoadWithRequest' era menos confiable. – Stunner

1

(Si es el mismo dominio) puede llamar a una función (en el elemento primario) desde el iframe.

top.iFrameLoaded(); 
Cuestiones relacionadas