UIWebView didFinishLoading多次触发

Ben*_*man 52 iphone xcode objective-c uiwebview ios

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

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

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

或者可能会延迟我的代码触发,直到所有这些事件都完成了?

小智 50

你可以做这样的事情来检查加载完成的时间.因为您可以在同一页面上拥有大量内容,所以您需要它.

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


wkw*_*wkw 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"));
    }
Run Code Online (Sandbox Code Playgroud)

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

也许您所看到的是由于重定向,或者如所提到的,在加载页面中的ajax调用.但是你至少应该能够平衡shouldStartLoad对其他两个委托函数的调用,并能够确定加载何时完成.

  • 不应该是(webView.loading?@"YES":@"NO")而不是(webView.loading?@"NO":@"YES") (7认同)

Vin*_*ngh 12

检查一下这么简单易行,无需编写太多代码:

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


Cez*_*zar 8

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

每次webview完成加载帧时都会调用上述方法.从UIWebViewDelegate协议文档:

webViewDidFinishLoad:
在Web视图完成加载框架后发送.

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


Yog*_*H T 7

试试这个它会工作正常

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