我有一个在多个 View Controller 中使用UIWebViews的应用程序。 UIWebViews用于呈现本地生成的html,不需要缓慢的网络访问。

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

问题在于用户会看到正在渲染的html,有时会伴随着样式的闪烁和其他各种不愉快的人工痕迹。我宁愿在屏幕外完成渲染,并在准备就绪时显示完全渲染的 View 。

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

我通过发送UIWebView消息来告诉loadHTMLString:baseURL:呈现什么内容。这是异步的,一段时间(不久)之后,Webview的委托(delegate)被调用回webViewDidFinishLoad

我尝试在viewWillAppear内运行runloop,或者运行NSDefaultRunLoopModeUITrackingRunLoopMode。这在模拟器中有效(它向日志提示



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

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

最佳答案

我认为这里有很多解决方案。一种快速的方法是在UIWebView的hidden属性设置为YES的情况下对其进行加载。然后将您的UIViewController设置为UIWebViews委托(delegate)并实现:
- (void)webViewDidFinishLoad:(UIWebView *)webView
在此处将属性设置回NO。

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

关于iphone - 延迟viewWillAppear直到webViewDidFinishLoad,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/933414/

10-14 22:39