2010-05-11 78 views
4

我正在加载一个比较大的(并且JavaScript重)的页面到一个UIWebView中,并且我想在它想的时候添加一个UIActivityView来旋转。UIWebView完成太快

问题是,我的- (void)webViewDidFinishLoad:(UIWebView *)webView方法在渲染实际发生之前被调用了很长时间。足够让我的微调器(它在停止时隐藏)永远不会显示出来。当UI被组装时,即使在UIWebView实际将商品拿到屏幕上之前有足够的时间来弄清楚它是否被破坏,微调框已经被停止和隐藏了。

我希望能有一个“webViewDidFinishRendering”,但是这将意味着,WebKit是比lickedy分裂快以外的东西... ;-)

的思考?也许我应该把事情搞定,并设置一个计时器来阻止它,并从WebView中实际发生的任何事情中解开它?

回答

4

这里是我如何处理,我需要确保在页面完全加载情况:添加一个JavaScript事件处理程序,做这样的事情document.onload事件:

function onDocumentLoad() { 
    window.location.href = 'myapp://loaded'; 
} 

然后在你的UIWebViewDelegate,你可以这样做:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
    if ([[request.URL absoluteString] isEqual:@"myapp://loaded"]) { 
     [activityIndicator stopAnimating]; 
     return NO; 
    } 
    return YES; 
} 
+0

整洁!我会尝试的! – 2010-05-13 00:53:36

+0

不幸的是,当webViewDidFinish ...方法执行时,这个问题被解雇了。然后几秒钟后WebView完成渲染地图。 – 2010-05-13 17:35:12

+0

你说这个页面是JavaScript重的。 DOM或页面加载完成时运行的javascript是否会导致呈现延迟?如果是这样,可能还有其他一些地方可以注入window.location.href赋值来在最后时刻停止微调。例如,如果您通过AJAX异步加载数据,则可能会有一些JavaScript回调在数据加载完成时触发。这只是找出为特定内容注入代码的正确位置。 – cduhn 2010-05-13 17:59:41

0

是的,正如你发现的那样,webViewDidFinishLoad会告诉你数据何时被加载到视图中,但是没有提供关于JS在完成后可能会发生什么的信息。不幸的是UIWebView相当有限。你可以做的最好的事情是通过stringByEvaluatingJavaScriptFromString来查询JS查询。如果您可以运行一些JS来测试网络视图中的事情是否完成,那么您可以每半秒钟完成一次,并在获得积极结果时解散微调器。