2011-10-05 34 views
16

Ho un UIWebView in una scheda che carica in viewDidLoad, ma se l'utente tocca un'altra scheda il caricamento sarà interrotto e verrà chiamato - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error, ma voglio sapere come controllare se webView è caricato se utente tocca la scheda precedente di nuovo, e se non è caricato sarà ricaricarlo, qualcosa di simileVerificare se UIWebView è caricato

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

    } 

Ma non funziona, aiutare per favore?

+0

L'unica soluzione (che ho trovato), che funziona bene: http://stackoverflow.com/questions/1662565/uiwebview-finished-loading-event/25620001# 25620001 – sabiland

risposta

27

UIWebview ha un metodo delegato webViewDidFinishLoad. Imposta un bool per indicare che è stato fatto.

- (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

non funziona ...:/ – vburojevic

+0

Quale parte non funziona? I metodi delegati vengono chiamati? – Zigglzworth

+0

sì, ma il problema è che il webviewdidfinishload viene chiamato dopo che non riesce a caricare, quindi il bool sarà sempre SÌ – vburojevic

8

Se non hai ancora funzionato, ecco un esempio funzionante. Mostra anche un avviso quando non si carica, e l'avviso viene visualizzato solo una volta.

Intestazione:

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

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

@end 

Implementazione:

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

Mi auguro che aiuta.

0

Per le pagine con più frame, deve essere utilizzata anche la proprietà UIWebView.loading.

Doc Apple: @property (nonatomico, readonly, getter = isLoading) BOOL caricamento Un valore booleano che indica se il destinatario ha terminato di caricare il contenuto.

Se SÌ, il ricevitore sta ancora caricando il contenuto; altrimenti, NO.

In iOS6 (beta 4) sembra che Apple abbia risolto alcuni problemi con questa proprietà. http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html

1

È vero che la domanda originale è stata pubblicata molti anni fa. Recentemente ho dovuto trovare una soluzione affidabile a questo problema.

ecco la soluzione che ha funzionato per me:

  1. Sostituito UIWebView con WKWebWiew.
  2. Aggiunto il codice 'evaluateJavaScript' durante la gestione del metodo delegato 'didFinishNavigation'.

il codice completo è:

- (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); 
     } 
    }]; 
} 
Problemi correlati