8

我有一个UIWebViews在多个视图控制器中使用的应用程序。UIWebViews用于渲染本地生成的 html,不需要慢速网络访问。

viewWillAppear为了节省内存,我只根据视图控制器回调的提示按需加载这些。(并卸载屏幕外实例以响应didReceiveMemoryWarning消息。)

问题是用户可以看到正在呈现的 html,有时伴随着样式的闪烁和其他各种令人不快的伪影。我宁愿渲染在屏幕外完成,并在准备好时显示完全渲染的视图。

viewWillAppear在 UIWebView 完全呈现之前能够不返回将是非常整洁的。但是怎么做?

我通过向它发送消息来告诉它UIWebView要呈现的内容。loadHTMLString:baseURL:这是异步的,稍后(很快)webview 的委托会被回调webViewDidFinishLoad

我尝试在内部运行一个 runloop viewWillAppear,运行NSDefaultRunLoopModeUITrackingRunLoopMode. 这在模拟器中有效(它向日志抱怨

[CATransaction synchronize] 在事务中调用

但确实有效)但在设备上它会死锁,webViewDidFinishLoad永远不会被调用。

(另外,似乎UIWebView加载属性不起作用。至少,在我调用之后loadHTMLString:baseURL:和在得到回调之前它不是真的。)

4

2 回答 2

3

我认为这里有很多解决方案。一个快速的方法是加载 UIWebView,并将其隐藏属性设置为 YES。然后将您的 UIViewController 设置为 UIWebViews 委托并实现:

- (void)webViewDidFinishLoad:(UIWebView *)webView

您将属性设置回 NO。

需要注意的是,如果您有框架/嵌入的内容,webViewDidFinishLoad 将多次触发。因此,您必须对此进行跟踪。如果您正在加载本地内容,这应该不是问题。

于 2009-06-01T03:38:58.733 回答
0

我最喜欢 monowerker 的解决方案,但另一种解决方案是一直保留已经渲染的 UIWebView(在比视图控制器更永久的对象中)。如果 monowerker 的解决方案看起来太具有破坏性,我只会这样做。

于 2009-06-02T04:41:50.297 回答