2011-10-05 20 views
16

Mam UIWebView w jednej zakładce tej ładunki w viewDidLoad, ale jeśli użytkownik dotknie inną kartę ładowanie zostanie przerwane i - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error zostanie wywołana, ale chcę wiedzieć, w jaki sposób można sprawdzić, czy Webview jest załadowany jeśli użytkownik dotknie poprzednią kartę ponownie, a jeśli to nie będzie on ładowany go przeładować, coś takiegoSprawdź, czy UIWebView jest ładowany

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

    } 

Ale to nie działa, proszę o pomoc?

+0

Jedynym rozwiązaniem (znalazłem), który działa ok: http://stackoverflow.com/questions/1662565/uiwebview-finished-loading-event/25620001# 25620001 – sabiland

Odpowiedz

27

UIWebview ma metodę delegowania webViewDidFinishLoad. Ustaw wartość bool, aby potwierdzić, że zostało to zrobione.

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

nie działa ...:/ – vburojevic

+0

Która część nie działa? Czy wywoływane są metody delegatów? – Zigglzworth

+0

tak, ale problem polega na tym, że webviewdidfinishload jest wywoływany po tym, jak się nie załaduje, więc bool zawsze będzie TAK – vburojevic

8

Jeśli jeszcze go nie masz, oto przykład działania. Pokazuje również ostrzeżenie, gdy nie można załadować, a alert jest wyświetlany tylko raz.

Header:

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

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

@end 

Realizacja:

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

Mam nadzieję, że pomaga.

0

Dla stron z wieloma ramkami należy również użyć właściwości UIWebView.loading.

Dokumenty Apple: @property (nonatomic, readonly, getter = isLoading) BOOL loading Wartość typu Boolean wskazująca, czy odbiorca zakończył ładowanie zawartości.

Jeśli TAK, odbiornik nadal ładuje zawartość; w przeciwnym razie NIE.

W wersji iOS6 (beta 4) wygląda na to, że Apple naprawił niektóre problemy z tą usługą. http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html

1

To prawda, że ​​oryginalne pytanie zostało opublikowane wiele lat temu. Niedawno musiałem znaleźć niezawodne rozwiązanie tego problemu.

Oto rozwiązanie, które pracował dla mnie:

  1. Zastąpiony UIWebView z WKWebWiew.
  2. Dodano kod "evaluateJavaScript" podczas obsługi metody delegatów "didFinishNavigation".

Kompletny kod jest:

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