检查是否已加载UIWebView

时间:2011-10-05 20:41:47

标签: iphone uiwebview

我在一个选项卡中有一个UIWebView加载到viewDidLoad中,但是如果用户点击其他选项卡,加载将被中断并且     - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error将被调用,但我想知道如果用户再次点击上一个标签,如何加载webView,如果没有加载它将重新加载它,如下所示

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

    }

但它不起作用,请帮忙吗?

4 个答案:

答案 0 :(得分:28)

UIWebview有一个webViewDidFinishLoad委托方法。设置一个bool来表明这已经完成。

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

}

答案 1 :(得分: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;
    }
}

我希望有所帮助。

答案 2 :(得分:1)

原始问题确实是多年前发布的。 最近我不得不为这个问题找到一个可靠的解决方案。

以下是适合我的解决方案:

  1. 用WKWebWiew替换了UIWebView。
  2. 在处理'didFinishNavigation'委托方法时添加了'evaluateJavaScript'代码。
  3. 完整的代码是:

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

答案 3 :(得分:0)

对于具有多个框架的页面,还应使用UIWebView.loading属性。

Apple的doc:@property(非原子,readonly,getter = isLoading)BOOL加载 一个布尔值,指示接收器是否已完成加载内容。

如果是,接收方仍在加载内容;否则,没有。

在iOS6(测试版4)中,Apple似乎也修复了此属性的一些问题。 http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html