在我的应用程序中,我需要一种方法来判断我的webview何时加载完成。如果内容是html,这很容易做到。然而,我的内容源是带有iFrame的javascript,这将导致UIWebView的finishedLoad方法被调用多次。有没有办法可以检查iframe是否已经加载完成?
在我的应用程序中,我需要一种方法来判断我的webview何时加载完成。如果内容是html,这很容易做到。然而,我的内容源是带有iFrame的javascript,这将导致UIWebView的finishedLoad方法被调用多次。有没有办法可以检查iframe是否已经加载完成?
我发现唯一可靠的方法是听取三种方法,分别表示开始加载、完成加载(以及“失败”的等效方法),并手动维护每个计数器。
比如这样:
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
}
}
如果是同一域名,你可以从 iframe 中调用父级的函数。
top.iFrameLoaded();
webView.isLoading
来检查一个webview的所有框架是否都已经加载完毕。无需计算iframe的数量。只需在webViewDidFinishLoad:
中检查isLoading
是否为真即可。