在我的某个应用中,我重复使用了一个webview。每次用户使用以下方法将重新加载缓存数据的特定视图输入到webview: -
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL
我等待回叫电话
- (void) webViewDidFinishLoad:(UIWebView *)webView.
与此同时,我隐藏了webview并显示了“加载”标签。 只有当我收到webViewDidFinishLoad时才会显示webview。
在我加载的新数据开始之前,我看到前面的数据在很短的时间内被加载到webview中,很多时候会发生这种情况。
在显示webview之前我已经加了0.2秒的延迟,但它没有帮助。
有没有人知道如何解决这个问题,或者在没有发布的情况下从webview中清除旧数据并每次都分配它,而不是通过增加延迟时间来解决这个问题?
答案 0 :(得分:11)
感谢malaki1974,在我的情况下,我没有使用模态视图。 当我和WWDC 2010上的Apple工程师坐在一起并问他这个问题时,他的答案很简单:“不要重复使用UIWebViews,这不是他们的使用方式。” 从那时起,我确保在分配新的UIWebView
之前调用这组行[self.myWebView removeFromSuperview];
self.myWebView.delegate = nil;
[self.myWebView stopLoading];
[self.myWebView release];
解决了这个问题。
答案 1 :(得分:7)
在尝试加载新内容之前清除webview的内容
[self loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
答案 2 :(得分:1)
首先,UIWebView
在后台线程中呈现内容。即使您收到webViewDidFinishLoad:
,也可能无法完成。特别是如果它是来自网络的ajax密集页面。
你说你正在隐藏视图。我想知道这是否意味着webview完全延迟了它的绘图。你可以尝试的是将UIWebView
移到屏幕外或用另一个视图模糊它。也许这会改变它的绘画行为。
如果您不需要交互式UIWebView
,那么您也可以考虑在单独的UIWindow
中完全在屏幕外执行,然后从UIWebView
的图层创建图像。< / p>
答案 3 :(得分:1)
这就是我的工作,而且有效:
[_webView stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"];
答案 4 :(得分:0)
尝试加载一个空白的本地文件或隐藏它时加载图形,而不是在显示时加载新内容。由于该文件是本地的,因此它很快,即使新页面需要一段时间加载它也会有空白或加载预期的行为。
答案 5 :(得分:0)
答案 6 :(得分:0)
如果你控制了html。文档准备好后,您可以与objective-c进行通信。就像在jQuery中一样:
function messageNative (name, string) {
var iframe = document.createElement("IFRAME");
iframe.setAttribute("src", "appscheme://" + name + "/" + string);
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null;
}
$(function() {
messageNative('webview', 'ready');
});
然后在UIWebView的委托方法webView:shouldStartLoadWithRequest:navigationType:等待请求,其中url等于“appscheme:// webview / ready”。然后您应该知道:文档已加载并准备好显示。然后,所有缺失的是一个简单的淡入或类似的东西:)