将viewWillAppear推迟到webViewDidFinishLoad

时间:2009-06-01 03:01:14

标签: iphone uiwebview

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

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

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

在UIWebView完全呈现之前,能够让viewWillAppear不返回是非常整洁的。但是如何?

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

我尝试在viewWillAppear内运行runloop,运行NSDefaultRunLoopModeUITrackingRunLoopMode。这适用于模拟器(它向日志抱怨

  在事务

中调用的

[CATransaction synchronize]

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

(另外,似乎UIWebView loading属性不起作用。至少,在我调用loadHTMLString:baseURL:之后,在获得回调之前,这不是真的。)

2 个答案:

答案 0 :(得分:3)

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

- (void)webViewDidFinishLoad:(UIWebView *)webView

将属性设置回NO。

需要注意的是,如果您有框架/嵌入内容,webViewDidFinishLoad将多次触发。所以你必须跟踪这个。如果您要加载本地内容,那不应该是一个问题。

答案 1 :(得分:0)

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