重复使用的UIWebView在iPhone上显示以前加载的内容

时间:2010-02-22 14:43:32

标签: iphone uiwebview

在我的某个应用中,我重复使用了一个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中清除旧数据并每次都分配它,而不是通过增加延迟时间来解决这个问题?

7 个答案:

答案 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”。然后您应该知道:文档已加载并准备好显示。然后,所有缺失的是一个简单的淡入或类似的东西:)