UIWebView 完成太快
Posted
技术标签:
【中文标题】UIWebView 完成太快【英文标题】:UIWebView finishes too fast 【发布时间】:2010-05-11 18:30:42 【问题描述】:我正在将一个大(和大量 javascript)页面加载到 UIWebView 中,我想添加一个 UIActivityView 在它思考时旋转。
问题是,我的 - (void)webViewDidFinishLoad:(UIWebView *)webView
方法在渲染实际发生之前很长一段时间被调用。足以让我的微调器(停止时隐藏)从未真正出现。当 UI 组装完成时,微调器已经停止并隐藏,即使在 UIWebView 实际将商品显示到屏幕之前有足够的时间怀疑它是否已损坏。
我希望有一个“webViewDidFinishRendering”,但这意味着 WebKit 不是 lickedy-split fast... ;-)
想法?也许我应该把它扔掉并设置一个计时器来停止它,然后从 WebView 中实际发生的任何事情中解开它?
【问题讨论】:
【参考方案1】:以下是我处理需要确保页面已完全加载的情况的方法:为 document.onload 事件添加一个 javascript 事件处理程序,该处理程序执行以下操作:
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;
【讨论】:
可悲的是,当 webViewDidFinish... 方法执行时,它就会被触发。几秒钟后,WebView 完成了地图的渲染。 你说这个页面是javascript重的。渲染延迟是由 DOM 或页面完成加载时运行的 javascript 引起的吗?如果是这样,可能还有其他点可以注入 window.location.href 分配以在最后一刻停止微调器。例如,如果您通过 AJAX 异步加载数据,则可能会在数据加载完成时触发一些 javascript 回调。只需找出为您的特定内容注入代码的正确位置即可。 好吧,我不确定我对它有多少发言权——我正在调用 Google Maps API。为什么用 UIMapView 代替呢?因为我的客户坚持在那个屏幕上看到谷歌地图风格的导航路径。我能想到的唯一方法是在 WebView 中使用 GMAPI。我会浏览他们的文档,看看他们完成工作后是否有什么我可以参考的。 太棒了!几件事:在 Google Maps API 中,您要做的是挂钩到 directionservice.route() 函数并设置回调来执行 window.location.href 分配。然后,在您的 webViewShouldStartLoadWithRequest 调用中,您必须进行一些转换,因为 NSURL 不能很好地与包含 URL 的 NSString 进行比较。愚蠢,但事实并非如此。我必须从 NSURL 的字符串值构建一个 stringWithFormat。但它有效!谢谢! 你是对的。我的代码示例应该说 [request.URL absoluteString]。我会编辑它以供记录。很高兴你让它正常工作。现在,只要 Google 不从您下面更改他们的 javascript,您就一切就绪。【参考方案2】:是的,正如您所发现的,webViewDidFinishLoad 会告诉您数据何时加载到视图中,但不会提供有关一旦完成 JS 可能会发生什么的信息。不幸的是 UIWebView 非常有限。您可能做的最好的事情是通过 stringByEvaluatingJavaScriptFromString 使用 JS 查询对其进行轮询。如果您可以运行一些 JS 来测试 Web 视图中的事情是否完成,您可以每半秒执行一次,并在获得肯定结果时关闭微调器。
【讨论】:
以上是关于UIWebView 完成太快的主要内容,如果未能解决你的问题,请参考以下文章
UIWebView 模态 YouTube 播放器“完成”按钮操作
UIWebView 完成加载后,如何强制重新布局 UITableViewCell?