2011-10-05 78 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); 
     } 
    }]; 
}