【发布时间】:2009-06-01 03:01:13
【问题描述】:
我有一个在多个视图控制器中使用UIWebViews 的应用程序。 UIWebViews 用于渲染本地生成的html,不需要慢速网络访问。
为了节省内存,我只根据视图控制器viewWillAppear 回调的提示按需加载这些内容。 (并卸载屏幕外实例以响应didReceiveMemoryWarning 消息。)
问题是用户可以看到正在呈现的 html,有时还伴随着样式的闪烁和其他各种令人不快的伪影。我更愿意在屏幕外完成渲染,并在准备好时显示完全渲染的视图。
在 UIWebView 完全呈现之前能够让viewWillAppear 不返回会非常整洁。但是怎么做呢?
我通过发送loadHTMLString:baseURL: 消息告诉UIWebView 要呈现什么。这是异步的,一段时间(很快)之后,webview 的委托被回调webViewDidFinishLoad。
我尝试在viewWillAppear 中运行一个runloop,运行NSDefaultRunLoopMode 或UITrackingRunLoopMode。这在模拟器中有效(它向日志抱怨
[CATransaction 同步] 在事务中调用
但确实有效)但在设备上它会死锁,webViewDidFinishLoad 永远不会被调用。
(另外,UIWebView 加载属性似乎不起作用。至少,在我调用 loadHTMLString:baseURL: 之后,在收到回调之前它不是真的。)
【问题讨论】:
-
“正在加载”属性确实有效,但只有在 UIWebView 出现在屏幕上时才会真正触发加载(如果您跟踪
webViewDidStartLoad和webViewDidFinishLoad)。提示往往会说“将其添加到不透明度为 0.01 的屏幕”,但这对于尚未出现在屏幕上的视图控制器无济于事......