代码之家  ›  专栏  ›  技术社区  ›  Ben Scheirman

UIWebView didFinishLoading多次触发

  •  52
  • Ben Scheirman  · 技术社区  · 15 年前

    我有一些代码需要在a之后运行 UIWebView 完成加载文档。为此,我设定了 UIWebView webViewDidFinishLoading 方法。

    根据要加载的页面类型,会多次调用此函数。我不确定这是因为ajax请求、图像请求还是iFrame。

    或者延迟我的代码启动,直到所有这些事件都启动完毕?

    9 回复  |  直到 12 年前
        1
  •  52
  •   Jens Erat    12 年前

    加载完成后,您可以执行类似的操作来检查。因为你可以在你需要的同一页上有很多内容。

    - (void)webViewDidFinishLoad:(UIWebView *)webview  {
        if (webview.isLoading)
            return;
        // do some work
    }
    
        2
  •  49
  •   devios1    10 年前

    记录加载开始和完成的跟踪可能会很有启发性(如果您还没有做到这一点的话)。

        - (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。

    shouldStartLoad 和其他两个委托函数之一,并且能够确定加载何时完成。

        3
  •  12
  •   Vinod Singh    10 年前

    选中此选项,它是一种简单易行的方法,无需编写太多代码:

    - (void)webViewDidFinishLoad:(UIWebView *)webView {
            if ([[webView stringByEvaluatingJavaScriptFromString:@"document.readyState"] isEqualToString:@"complete"]) {
                // UIWebView object has fully loaded.
            }
        }
    
        4
  •  9
  •   Cezar    12 年前

    这个问题已经解决了,但我发现它缺少一个答案来解释为什么要多次呼叫 webViewDidFinishLoad 实际上是预期的行为

    每当webview加载完一个帧时,就会调用前面提到的方法。从 UIWebViewDelegate protocol documentation :


    在web视图完成加载帧后发送。

    事实上,对于构成 UIWebViewDelegate 协议

        5
  •  7
  •   Yogeesh H T    10 年前

    试试这个,它会很好用的

     -(void)webViewDidFinishLoad:(UIWebView *)webview  
        {
           if (webview.isLoading)
               return;
           else
           {
               // Use the code here which ever you need to run after webview loaded 
           }
        }
    
        6
  •  3
  •   Viswanth Chadalawada    9 年前

    这是因为每次加载帧时都会调用回调方法。为了防止出现这种情况,请将webview的“SuppresseIncrementalRendering”属性设置为true。这将阻止webview在整个数据加载到内存之前进行渲染。这对我起了作用

        7
  •  2
  •   Justin Boo    12 年前

    我注意到类似的事情,这是一个困惑:我有一个 UITabBarController ViewControllers 在启动应用程序时链接到其选项卡(尽管只显示第一个\u选项卡\u ViewController),因此当多个选项卡 ViewController 与WebView各自 webViewDidFinishLoad 调用,如果我已复制粘贴:

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

    UIWebViews .

        8
  •  1
  •   nico    15 年前

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

        9
  •  -1
  •   Alfie Hanssen    12 年前

    iOS6中引入的UIWebView上的一个属性可能与此问题有关: suppressesIncrementalRendering .