推迟viewWillAppear中,直到webViewDidFinishLoad
https://stackoverflow.com/questions/933414
题
我有一个使用UIWebViews
在几个视图控制器的应用程序。的UIWebViews
用于呈现本地生成的HTML,不需要慢的网络访问。
要保存存储器I仅由的ViewController viewWillAppear
回调的提示在需要加载这些。 (和卸载屏幕外响应于didReceiveMemoryWarning
消息实例。)
的问题是,用户得到看到的HTML被呈现,有时伴有造型和其他各种不愉快的伪影闪烁。我宁愿渲染来完成屏幕外,并揭示了完全渲染视图时,它的准备。
这将是非常整洁,能够有viewWillAppear
才会返回UIWebView中完全呈现。但如何?
我告诉UIWebView
通过发送一个loadHTMLString:baseURL:
消息渲染什么。这是异步的,并且在一段时间(快)以后的WebView委托被称为回webViewDidFinishLoad
。
我尝试与运行内部viewWillAppear
一个runloop,运行的是NSDefaultRunLoopMode
或UITrackingRunLoopMode
。这个作品在模拟器(它抱怨到日志
[CATransaction同步]称为事务内
但不工作),但在设备上它死锁,与webViewDidFinishLoad
从未被调用。
(此外,它似乎像UIWebView
装载属性不起作用。至少,在我打电话loadHTMLString:baseURL:
并得到它是不正确的回调之前。)
没有正确的解决方案
其他提示
解决方案的很多在这里,我想。一个快速的一个是与它的隐藏属性设置为YES来加载的UIWebView。然后设置你的UIViewController为UIWebViews中的代表和执行:
- (void)webViewDidFinishLoad:(UIWebView *)webView
在其中设置的属性回到NO。
在这里要注意的是,webViewDidFinishLoad将火不止一次如果你已经成帧/嵌入式内容。所以,你必须跟踪这个。真的不应该是一个问题,如果要加载本地内容。
我喜欢monowerker的溶液最好的,但另一种解决办法是将抓住的已呈现的UIWebView所有的时间(在除视图控制器一些更持久的对象)。我只有这样做,如果monowerker的解决方案的样子太具有破坏性。