Повторно использованный UIWebView, показывающий ранее загруженный контент на короткую секунду на iPhone - PullRequest
9 голосов
/ 22 февраля 2010

В одном из моих приложений я повторно использую веб-просмотр. Каждый раз, когда пользователь вводит определенное представление о перезагрузке кэшированных данных в веб-просмотр, используя метод: -

- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL

и я жду обратного звонка

- (void) webViewDidFinishLoad:(UIWebView *)webView.

Тем временем я скрываю веб-просмотр и показываю ярлык «загрузки». Только когда я получаю webViewDidFinishLoad, я показываю веб-просмотр.

Много раз, что происходит, я вижу предыдущие данные, которые были загружены в веб-просмотр за короткую секунду, прежде чем новые данные, которые я загрузил, активируются.

Я уже добавил задержку в 0,2 секунды перед отображением веб-просмотра, но это не помогло.

Вместо того, чтобы решить эту проблему, добавив больше времени к задержке, кто-нибудь знает, как решить эту проблему, или, возможно, очистить старые данные из веб-просмотра без публикации и распределять их каждый раз?

Ответы [ 7 ]

11 голосов
/ 20 февраля 2011

Спасибо, malaki1974, в моем случае я не использовал модальное представление. Когда я сидел с инженером Apple на WWDC 2010 и задавал ему этот вопрос, он отвечал просто: «Не используйте UIWebViews, это не то, что они должны были использовать». С тех пор я вызываю этот набор строк перед выделением нового UIWebView

[self.myWebView removeFromSuperview];
self.myWebView.delegate = nil;
[self.myWebView stopLoading];
[self.myWebView release];

Это решило проблему.

7 голосов
/ 15 августа 2012

Очистите содержимое веб-просмотра, прежде чем пытаться загрузить новый контент

[self loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
1 голос
/ 05 декабря 2013

Вот что я делаю, и это работает:

[_webView stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"];
1 голос
/ 22 февраля 2010

Сначала UIWebView отображает содержимое в фоновом потоке. Даже когда вы получаете webViewDidFinishLoad:, это может быть сделано не полностью. Особенно, если это интенсивная страница, доступная из сети.

Вы говорите, что скрываете вид. Интересно, означает ли это, что веб-просмотр полностью задерживает рисование? То, что вы можете попробовать, это переместить UIWebView за экран или скрыть его другим видом. Может быть, это изменит его поведение при рисовании.

Если вам не нужен интерактивный UIWebView, вы можете также сделать его полностью за кадром в отдельном UIWindow, а затем создать изображение из этого слоя UIWebView.

0 голосов
/ 24 сентября 2012

Если вы получили контроль над HTML. Вы можете связаться с целью-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». Тогда вы должны знать: документ загружен и готов к отображению. Тогда все, чего не хватает, - это простого появления или что-то в этом роде:)

0 голосов
/ 19 февраля 2011
0 голосов
/ 08 апреля 2010

Попробуйте загрузить локальный файл, который является пустым или имеет загрузочную графику, когда вы его скрываете, а не просто загружаете новый контент, когда вы его показываете. Поскольку файл является локальным, он будет быстрым, и даже если загрузка новой страницы займет некоторое время, он будет либо пустым, либо загружается ожидаемым образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...