【问题标题】:UIWebView finishes too fastUIWebView 完成太快
【发布时间】:2010-05-11 18:30:42
【问题描述】:

我正在将一个大(和大量 javascript)页面加载到 UIWebView 中,我想添加一个 UIActivityView 在它思考时旋转。

问题是,我的 - (void)webViewDidFinishLoad:(UIWebView *)webView 方法在渲染实际发生之前很长一段时间被调用。足以让我的微调器(停止时隐藏)从未真正出现。当 UI 组装完成时,微调器已经停止并隐藏,即使在 UIWebView 实际将商品显示到屏幕之前有足够的时间怀疑它是否已损坏。

我希望有一个“webViewDidFinishRendering”,但这意味着 WebKit 不是 lickedy-split fast... ;-)

想法?也许我应该把它扔掉并设置一个计时器来停止它,然后从 WebView 中实际发生的任何事情中解开它?

【问题讨论】:

    标签: iphone uiwebview


    【解决方案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 视图中的事情是否完成,您可以每半秒执行一次,并在获得肯定结果时关闭微调器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 2011-11-17
      • 2010-12-12
      • 2010-10-30
      • 1970-01-01
      相关资源
      最近更新 更多