Check if UIWebView is loaded

前端 未结 4 369
陌清茗
陌清茗 2021-02-01 21:19

I have an UIWebView in one tab that loads in viewDidLoad, but if user taps other tab the loading will be disrupted and - (void)webView:(UIWebView *)webView didFailLoad

相关标签:
4条回答
  • 2021-02-01 21:25

    It is true that the original question was posted many years ago. Recently I had to find a reliable solution to this issue.

    Here is the solution that worked for me:

    1. Replaced UIWebView with WKWebWiew.
    2. Added 'evaluateJavaScript' code while handling the 'didFinishNavigation' delegate method.

    The complete code is:

       - (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 讨论(0)
  • 2021-02-01 21:34

    UIWebview has a webViewDidFinishLoad delegate method. Set a bool to indicate this was done.

    - (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 讨论(0)
  • 2021-02-01 21:42

    If you haven't got it to work yet, here is a working example. It also shows an alert when failing to load, and the alert is only shown once.

    Header:

    @interface MyViewController : UIViewController <UIWebViewDelegate> {
        BOOL wasLoaded;
        BOOL alertWasShown;
    }
    
    @property (nonatomic, retain) IBOutlet UIWebView *myWebView;
    
    @end
    

    Implementation:

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

    I hope that helps.

    0 讨论(0)
  • 2021-02-01 21:43

    For pages with multiple frames, UIWebView.loading property should also be used.

    Apple's doc: @property(nonatomic, readonly, getter=isLoading) BOOL loading A Boolean value indicating whether the receiver is done loading content.

    If YES, the receiver is still loading content; otherwise, NO.

    In iOS6 (beta 4) it looks like Apple has fixed some issues with this property as well. http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html

    0 讨论(0)
提交回复
热议问题