我有一个在多个 View Controller 中使用UIWebViews
的应用程序。 UIWebViews
用于呈现本地生成的html,不需要缓慢的网络访问。
为了节省内存,我只按照viewcontroller viewWillAppear
回调的提示按需加载它们。 (并卸载屏幕外实例以响应didReceiveMemoryWarning
消息。)
问题在于用户会看到正在渲染的html,有时会伴随着样式的闪烁和其他各种不愉快的人工痕迹。我宁愿在屏幕外完成渲染,并在准备就绪时显示完全渲染的 View 。
能够使viewWillAppear
在完全呈现UIWebView之前不返回,这将非常整洁。但是如何?
我通过发送UIWebView
消息来告诉loadHTMLString:baseURL:
呈现什么内容。这是异步的,一段时间(不久)之后,Webview的委托(delegate)被调用回webViewDidFinishLoad
。
我尝试在viewWillAppear
内运行runloop,或者运行NSDefaultRunLoopMode
或UITrackingRunLoopMode
。这在模拟器中有效(它向日志提示
但确实有效),但在设备上会死锁,永远不会调用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/