如何确定UIWebView中的iFrame加载完成

7

在我的应用程序中,我需要一种方法来判断我的webview何时加载完成。如果内容是html,这很容易做到。然而,我的内容源是带有iFrame的javascript,这将导致UIWebView的finishedLoad方法被调用多次。有没有办法可以检查iframe是否已经加载完成?

3个回答

7

我发现唯一可靠的方法是听取三种方法,分别表示开始加载、完成加载(以及“失败”的等效方法),并手动维护每个计数器。

比如这样:

int outstandingRequests;

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    outstandingRequests++;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    outstandingRequests--;

    if( outstandingRequests < 1 )
    viewLoadingPleaseWait.hidden = TRUE;
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    outstandingRequests--;
}

我通常还需要覆盖didFail方法 - Apple错误地使用它来报告例如YouTube播放器已经接管了处理YouTube视频。这不是失败,而是“页面由其他应用程序加载”。

例如:

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    outstandingRequests--;

    if( [error code] == NSURLErrorCancelled )
    {
        NSLog(@"[%@] ...webView CANCELLED loading", [self class] );
    }
    else if( [[error domain] isEqualToString:@"WebKitErrorDomain"]
    && [error code] == 204)
    {
        // no worries ... YouTube, iCal, or etc took over the page load
    }
}

+1,非常有帮助,谢谢!提醒一下,我最终在“- (void)webViewDidStartLoad:(UIWebView *)aWebView”方法中增加了outstandingRequests计数器,因为“shouldStartLoadWithRequest”方法不太可靠。 - Stunner

1

如果是同一域名,你可以从 iframe 中调用父级的函数。

top.iFrameLoaded();

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接