UIWebView didFinishLoading会多次触发

我有一些需要在UIWebView完成加载文档后运行的代码。 为此,我已经将UIWebView的委托设置为我的控制器,并实现了webViewDidFinishLoading方法。

这将被多次调用,具体取决于要加载的页面的types。 我不确定是否因为Ajax请求,图片请求,甚至是内部框架。

有没有办法告诉主要的请求已经完成,这意味着HTML是完全加载的?

或者也许延迟我的代码发射,直到所有这些事件完成射击?

这可能是启发(如果你还没有走这么远)NSLog一个负载的轨迹开始和结束。

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

我只是在我的一个项目中看过所有这三个调用,从我的包中加载一个帮助页面,并包含embedded式资源(外部css,YUI !,图像)。 唯一的请求是初始页面加载, shouldStartLoadWithRequest不被调用的任何依赖。 所以很好奇为什么你的didFinishLoad被多次调用。

也许你所看到的是由于redirect,或者如上所述,在一个加载页面内的ajax调用。 但你至less应该能够平衡调用shouldStartLoad和其他两个委托函数,并能够确定何时加载完成。

你可以做这样的事情来检查何时加载完成。 因为你可以在同一页面上有很多内容,所以你需要它。

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

检查这一个它如此简单和简单的方法来实现,无需编写太多的代码:

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

这个问题已经解决,但我看到它缺乏一个答案,实际解释了为什么多次调用webViewDidFinishLoad实际上是预期的行为

每当webview完成加载一个框架时,就会调用上述方法。 从UIWebViewDelegate协议文档 :

webViewDidFinishLoad:
在Web视图完成加载帧后发送。

实际上,对于组成UIWebViewDelegate协议的所有其他方法也是如此。

试试这个,它会正常工作

  -(void)webViewDidFinishLoad:(UIWebView *)webview { if (webview.isLoading) return; else { // Use the code here which ever you need to run after webview loaded } } 

发生这种情况是因为每次加载完成一个帧都会调用callback方法。 为了防止这个webview的“suppressesIncrementalRendering”属性设置为true。 这将阻止webview渲染,直到整个数据被加载到内存中。 这为我做了诡计

我注意到类似的东西,这是一个混乱:我有一个UITabBarController ,它似乎预载所有的ViewControllers链接到其启动应用程序的标签(尽pipe显示只是first_Tab_ViewController),所以当几个标签有WebView ViewController他们各自的webViewDidFinishLoad被调用,如果我复制粘贴:

 NSLog(@"size width %0.0f height %0.0f", fitingSize.width, fittingSize.height); 

在几个,我在控制台中得到几个输出,当他们真的是在两个不同的UIWebViews单一调用似乎是一个双重调用。

您可以检查webViewDidFinishLoad方法中的加载和请求属性

可能与这个问题有关的是iOS6中引入的UIWebView属性: suppressesIncrementalRendering