2011-10-05 18 views
16

Tengo un UIWebView en una pestaña que se carga en viewDidLoad, pero si el usuario toca otra pestaña la carga se interrumpirá y se llamará - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error, pero quiero saber cómo se puede verificar si carga webView Si el usuario toca la pestaña anterior de nuevo, y si no se lo cargó volverá a introducirlo, algo como estoComprueba si UIWebView está cargado

-(void)viewWillAppear:(BOOL)animated 
{ 
    if (!webView) 
     { 
      NSURL *url = [NSURL URLWithString:@"url"]; 
      NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
      [webView loadRequest:request]; 
     } 

    } 

Pero no está funcionando, ayudar por favor?

+0

La única solución (me pareció) que funciona bien: http://stackoverflow.com/questions/1662565/uiwebview-finished-loading-event/25620001# 25620001 – sabiland

Respuesta

27

UIWebview tiene un método delegado webViewDidFinishLoad. Establezca un bool para indicar que esto se hizo.

- (void)webViewDidStartLoad:(UIWebView *)webView { 

webViewDidFinishLoadBool = NO; 
loadFailedBool = NO; 

} 


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

loadFailedBool = YES; 
} 


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

    if (!loadFailedBool) 
    webViewDidFinishLoadBool = YES; 

} 
+0

no funciona ...:/ – vburojevic

+0

¿Qué pieza no funciona? ¿Se están llamando a los métodos de delegado? – Zigglzworth

+0

sí, pero el problema es que se llama a la carga webviewdidfinishload después de que no se carga, por lo que el bool siempre será SÍ – vburojevic

8

Si aún no lo ha hecho funcionar, aquí hay un ejemplo de trabajo. También muestra una alerta cuando no se carga, y la alerta solo se muestra una vez.

Cabecera:

@interface MyViewController : UIViewController <UIWebViewDelegate> { 
    BOOL wasLoaded; 
    BOOL alertWasShown; 
} 

@property (nonatomic, retain) IBOutlet UIWebView *myWebView; 

@end 

Implementación:

- (void)loadWebView:(NSString *)urlString { 
    if (wasLoaded == NO) { 
     NSURL *url = [NSURL URLWithString:urlString]; 
     NSURLRequest *requestObject = [NSURLRequest requestWithURL:url]; 
     [myWebView loadRequest:requestObject]; 
    } 
} 

- (void)viewWillAppear:(BOOL)animated { 
    NSString *urlString = @"put your url here"; 
    [self loadWebView:urlString]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    wasLoaded = NO; 
    alertWasShown = NO; 
    myWebView.delegate = self; 
} 

- (void)webViewDidStartLoad:(UIWebView *)webView { 
    // Not necessary to do anything here. 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    wasLoaded = YES; // Indicates that it finished loading. 
} 

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 
    if (alertWasShown == NO) { 
     UIAlertView *alert = ... // Create an alert. 
     [alert show]; 

     alertWasShown = YES; 
    } 
} 

Espero que ayude.

0

Para páginas con marcos múltiples, también se debe usar la propiedad UIWebView.loading.

Apple's doc: @property (nonatomic, readonly, getter = isLoading) BOOL loading Valor booleano que indica si el receptor ha terminado de cargar contenido.

En caso afirmativo, el receptor sigue cargando contenido; De otra manera no.

En iOS6 (beta 4) parece que Apple ha solucionado algunos problemas con esta propiedad también. http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html

1

Es cierto que la pregunta original se publicó hace muchos años. Recientemente tuve que encontrar una solución confiable para este problema.

Aquí está la solución que funcionó para mí:

  1. Sustituido UIWebView con WKWebWiew.
  2. Agregó el código 'evaluateJavaScript' al manejar el método de delegado 'didFinishNavigation'.

El código completo es:

- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{ 
    [webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error) { 
     if (result != nil) { 
      // Call your method here 
     } 
     if(error) { 
      NSLog(@"evaluateJavaScript error : %@", error.localizedDescription); 
     } 
    }]; 
} 
Cuestiones relacionadas