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
。