首页 文章

检查是否已加载UIWebView

提问于
浏览
17

我在一个选项卡中有一个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 回答

  • 8

    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;
    
    }
    
  • 28

    如果你还没有工作,这是一个有效的例子 . 它还会在无法加载时显示警报,并且警报仅显示一次 .

    Headers :

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

    我希望有所帮助 .

  • 1

    确实,原始问题是多年前发布的 . 最近我必须找到一个可靠的解决方案来解决这个问题 .

    这是适合我的解决方案:

    • 用WKWebWiew替换了UIWebView .

    • 在处理'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);
            }
        }];
    }
    
  • 0

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

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

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

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

相关问题