2011-10-05 221 views
16

我有一個UIWebView在加載在viewDidLoad中的一個標籤,但如果用戶點擊其他標籤加載將會中斷,並且會調用,但我想知道如何檢查webView是否加載如果用戶再次點之前的選項卡,如果它沒有加載它會重新加載它,像這樣檢查UIWebView是否加載

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

    } 

但它不工作,幫助嗎?

+0

唯一的解決辦法(我發現)這工程確定:http://stackoverflow.com/questions/1662565/uiwebview-finished-loading-event/25620001# 25620001 – sabiland

回答

27

UIWebview有一個webViewDidFinishLoad委託方法。設置一個布爾值來表明這已完成。

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

不能正常工作...:/ – vburojevic

+0

哪部分不工作?委託方法是否被調用? – Zigglzworth

+0

是的,但問題是webviewdidfinishload在加載失敗後被調用,所以bool將始終爲YES – vburojevic

8

如果你還沒有得到它的工作,這裏是一個工作的例子。它還會在加載失敗時顯示警報,並且警報僅顯示一次。

頁眉:

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

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

@end 

實現:

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

我希望幫助。

0

對於具有多個框架的頁面,還應該使用UIWebView.loading屬性。

Apple's doc:@property(nonatomic,readonly,getter = isLoading)BOOL正在加載 一個布爾值,指示接收方是否完成加載內容。

如果是,則接收方仍在加載內容;否則,否。

在iOS6(測試版4)中,它看起來像蘋果已修復此屬性的一些問題。 http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html

1

確實,原來的問題是多年前發佈的。 最近我不得不爲這個問題找到一個可靠的解決方案。

這裏是爲我工作的解決方案:

  1. 與WKWebWiew替換的UIWebView。
  2. 在處理'didFinishNavigation'委託方法時添加了'evaluateJavaScript'代碼。

完整的代碼是:

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