UIWebView didFinishLoading多次触发

时间:2009-12-03 19:38:56

标签: iphone ios objective-c xcode uiwebview

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

这会被多次调用,具体取决于要加载的页面类型。我不确定是不是因为ajax请求,图片请求,甚至是iframe。

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

或者可能会延迟我的代码被解雇,直到所有这些事件都被解雇?

9 个答案:

答案 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