UIWebView didFinishLoading fires multiple times UIWebView didFinishLoading fires multiple times objective-c objective-c

UIWebView didFinishLoading fires multiple times


You can do something like this to check when loading is finished. Because you can have a lot of content on the same page you need it.

- (void)webViewDidFinishLoad:(UIWebView *)webview  {    if (webview.isLoading)        return;    // do some work}


It could be enlightening (if you haven't gone this far yet) to NSLog a trace of load starts and finishes.

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {       NSLog(@"Loading: %@", [request URL]);       return YES;    }    - (void)webViewDidFinishLoad:(UIWebView *)webView {       NSLog(@"didFinish: %@; stillLoading: %@", [[webView request]URL],            (webView.loading?@"YES":@"NO"));    }    - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {       NSLog(@"didFail: %@; stillLoading: %@", [[webView request]URL],            (webView.loading?@"YES":@"NO"));    }

I just watched the calls to all three in one of my projects which loads a help page from my bundle and contains embedded resources (external css, YUI!, images). The only request that comes through is the initial page load, shouldStartLoadWithRequest isn't called for any of the dependencies. So it is curious why your didFinishLoad is called multiple times.

Perhaps what you're seeing is due to redirects, or as mentioned, ajax calls within a loaded page. But you at least should be able balance calls to shouldStartLoad and either of the other two delegate functions and be able to determine when the loading is finished.


Check this one it so simply and easy way to achieve no need to write too much code:

- (void)webViewDidFinishLoad:(UIWebView *)webView {        if ([[webView stringByEvaluatingJavaScriptFromString:@"document.readyState"] isEqualToString:@"complete"]) {            // UIWebView object has fully loaded.        }    }