【问题标题】:Check if UIWebView is loaded检查是否加载了 UIWebView
【发布时间】:2011-10-05 20:41:46
【问题描述】:

我在 viewDidLoad 中加载的一个选项卡中有一个 UIWebView,但是如果用户点击其他选项卡,加载将被中断并且 - (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];
        }

    }

但它不起作用,请帮忙?

【问题讨论】:

标签: iphone uiwebview


【解决方案1】:

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;

}

【讨论】:

  • 哪个部分不工作?是否调用了委托方法?
  • 是的,但问题是加载失败后调用了webviewdidfinishload,所以bool永远是YES
  • 嗯.. 试试我对上面代码所做的更新。它设置另一个布尔值来指示失败。
【解决方案2】:

如果您还没有让它工作,这里有一个工作示例。加载失败时也会显示警报,并且警报只显示一次。

标题:

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

希望对你有帮助。

【讨论】:

    【解决方案3】:

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

    这是对我有用的解决方案:

    1. 将 UIWebView 替换为 WKWebWiew。
    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);
            }
        }];
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-26
        • 2011-05-01
        • 1970-01-01
        相关资源
        最近更新 更多