Iphone UIWebView didFinishLoading多次触发

Iphone UIWebView didFinishLoading多次触发,iphone,ios,objective-c,xcode,uiwebview,Iphone,Ios,Objective C,Xcode,Uiwebview,我有一些代码需要在aUIWebView加载完文档后运行。为此,我将UIWebView的委托设置为我的控制器,并实现了webviewdidfinishload方法 根据要加载的页面类型,会多次调用此函数。我不确定这是因为ajax请求、图像请求还是iFrame 有没有办法告诉我们主请求已经完成,也就是说HTML已经完全加载了 或者可能延迟我的代码启动,直到所有这些事件都启动完毕?您可以在webViewDidFinishLoad方法中检查加载和请求属性您可以执行类似操作,以检查加载何时完成。因为你可以

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

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

有没有办法告诉我们主请求已经完成,也就是说HTML已经完全加载了


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

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

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

- (void)webViewDidFinishLoad:(UIWebView *)webview  {
    if (webview.isLoading)
        return;
    // do some work
}
记录加载开始和完成的跟踪可能会很有启发性(如果您还没有做到这一点的话)

    - (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
和其他两个委托函数的调用,并能够确定加载何时完成。

我注意到类似的情况,这是一个混淆:我有一个
UIAbbarController
,在启动应用程序时,它似乎会预加载链接到其选项卡的所有
ViewController
(尽管只显示了第一个\u Tab\u ViewController),因此当几个选项卡使用WebView调用
ViewController
时,会调用它们各自的
webViewDidFinishLoad
,如果我复制了粘贴:

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

在几个例子中,我在控制台中得到了几个输出,当它们在两个不同的
UIWebViews

中进行单次调用时,它们似乎是双重调用。这个问题已经解决了,但我发现它缺少一个答案,实际上解释了为什么对
webViewDidFinishLoad
的多次调用实际上是预期行为

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

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


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

可能与此问题相关的是iOS6中介绍的UIWebView上的一个属性:
抑制增量渲染

检查此项,它是一种非常简单和容易的方法,无需编写太多代码:

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

试试这个,它会很好用的

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

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

我检查了内容类型HTTP头和URL,但它们没有给我任何有用的信息。你建议看什么信息?好吧,这种方法有效(事实上比我之前炮制的NSTimer讨厌的东西干净多了)。不幸的是,它不止一次地到达//Dosomework部分,很可能是因为请求之间存在延迟。如何确保它只被调用一次?当你说“请求之间的延迟”时,你是在用NSUrl发出多个请求吗?如果需要关联请求,可以使用webview的request属性。如果你想在twitter上直接给我发消息,我们可以解决这个问题,然后更新这篇文章。是的,最终If(webview.loading)返回false,我执行我的代码(比如显示警报)。警报框显示两次,因为显然在主请求完成后,其他内容开始加载。。。我不确定。@Ari你有没有真的看过?对我来说,didStartLoad总是给出webView.loading==true,而didFinishLoad则给出webView.loading==false。我想知道,如果逻辑如此简单,国旗会是什么,这最终帮助我弄明白了。我使用自己的webView ivar来确定请求URL,但这一点从未改变。传入该方法的webView包含实际的当前请求URL,我可以看到所有额外的内容加载(iFrame等)。谢谢你的帮助!不应该是(webView.loading?@“YES”:@“NO”)而不是(webView.loading?@“NO”:@“YES”)wkw,我也有同样的问题。你能帮帮我吗;我就是搞不懂你是如何“平衡”调用这些委托函数的?-(void)webViewDidFinishLoad:(UIWebView*)webView{self.loadBalance--;if(self.loadBalance==0)//ACTUAL page finished load}-(void)webViewDidStartLoad:(UIWebView*)webView{self loadBalance++;}我看到页面重定向给我两个shouldStart调用和一个didFinish调用。有人知道如何处理这个问题吗?比赛迟到了3年,但你找到可靠的解决方案了吗?您选择了一个答案,声称通过的
webView
为您提供了实际的当前请求URL,这与我的观察结果完全不同。我总是得到原始的
[UIWebView loadRequest]
URL,因此不知道启动/加载了什么。到目前为止,我也没有回答。嗨,乔里斯,也许我的贡献应该是一个评论,而不是一个答案。不管怎样,我相信它确实与所提出的问题直接相关,但这并不能解决问题。查看苹果文档:尽管我将其设置为true,但仍然不断调用回调。您将如何将其转移到Swift?罪