【发布时间】:2010-05-14 20:24:31
【问题描述】:
在我的应用程序中,我需要一种方法来判断我的 web 视图何时完成加载。如果内容是 html,这很容易做到。但是,我的内容源是javascript,里面有iFrame,会导致UIWebViewfinishedLoad方法被调用多次。无论如何我可以检查 iframe 是否已完成加载?
【问题讨论】:
标签: javascript iphone iframe
在我的应用程序中,我需要一种方法来判断我的 web 视图何时完成加载。如果内容是 html,这很容易做到。但是,我的内容源是javascript,里面有iFrame,会导致UIWebViewfinishedLoad方法被调用多次。无论如何我可以检查 iframe 是否已完成加载?
【问题讨论】:
标签: javascript iphone 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
}
}
【讨论】:
- (void)webViewDidStartLoad:(UIWebView *)aWebView 方法中的未完成请求计数器,因为 shouldStartLoadWithRequest 的可靠性较低。
(如果是同一个域)您可以从 iframe 调用一个函数(在父级中)。
top.iFrameLoaded();
【讨论】:
要判断一个 webview 是否正在加载,你可以使用
webView.isLoading
检查 webview 的所有框架是否已完成加载。不计算必要的 iframe 数量。只需检查isLoading 在webViewDidFinishLoad: 中是否为真
【讨论】: