我有一些代码需要在a UIWebView
完成加载文档后运行。为此,我将UIWebView
的委托设置为我的控制器,并实现了webViewDidFinishLoading
方法。
这会被多次调用,具体取决于要加载的页面类型。我不确定是不是因为ajax请求,图片请求,甚至是iframe。
有没有办法告诉主要请求已经完成,这意味着HTML已完全加载?
或者可能会延迟我的代码被解雇,直到所有这些事件都被解雇?
答案 0 :(得分:50)
你可以做这样的事情来检查加载完成的时间。因为您可以在同一页面上拥有大量内容,所以您需要它。
- (void)webViewDidFinishLoad:(UIWebView *)webview {
if (webview.isLoading)
return;
// do some work
}
答案 1 :(得分:48)
它可能具有启发性(如果你还没有走到这一步)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"));
}
我只是在我的一个项目中看到了对所有三个的调用,这个项目从我的包中加载一个帮助页面并包含嵌入的资源(外部css,YUI!,图像)。唯一的请求是初始页面加载,不会为任何依赖项调用shouldStartLoadWithRequest
。所以很奇怪为什么你的didFinishLoad被多次调用。
也许你所看到的是由于重定向,或者如所提到的,在加载页面中的ajax调用。但是你至少应该能够平衡对shouldStartLoad
和其他两个委托函数之一的调用,并能够确定加载何时完成。
答案 2 :(得分:12)
检查这一个,这样简单易行,无需编写太多代码:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
if ([[webView stringByEvaluatingJavaScriptFromString:@"document.readyState"] isEqualToString:@"complete"]) {
// UIWebView object has fully loaded.
}
}
答案 3 :(得分:8)
这个问题已经解决了,但我看到它缺少一个答案,实际上解释了为什么多次调用webViewDidFinishLoad
实际上是预期的行为
每次webview完成加载帧时都会调用上述方法。来自UIWebViewDelegate protocol documentation:
<强> webViewDidFinishLoad:强>
在Web视图完成加载框架后发送。
事实上,对于构成UIWebViewDelegate
协议的所有其他方法也是如此。
答案 4 :(得分:7)
试试这个它会正常工作
-(void)webViewDidFinishLoad:(UIWebView *)webview
{
if (webview.isLoading)
return;
else
{
// Use the code here which ever you need to run after webview loaded
}
}
答案 5 :(得分:3)
这是因为每次加载帧时都会调用回调方法。为了防止这个设置,&#34;抑制增量渲染&#34; webview的属性为true。这将阻止webview呈现,直到整个数据加载到内存中。这对我来说很有把戏
答案 6 :(得分:2)
我注意到类似的东西,这是一个混乱:我有一个UITabBarController
,它似乎预先加载所有ViewControllers
链接到其启动应用程序的选项卡(尽管只显示first_Tab_ViewController),所以当多个标签有ViewController
和WebView时,他们各自的webViewDidFinishLoad
被调用,如果我复制了粘贴:
NSLog(@"size width %0.0f height %0.0f", fitingSize.width, fittingSize.height);
在几个中,我在控制台中得到了几个输出,当它们真的是两个不同的UIWebViews
中的单个呼叫时,看起来是双重呼叫。
答案 7 :(得分:1)
您可以在webViewDidFinishLoad方法
中检查加载和请求属性答案 8 :(得分:-1)
可能与此问题相关的是iOS6中引入的UIWebView上的属性:suppressesIncrementalRendering
。