2010-05-11 4 views
4

Я загружаю страницу Biggish (и javascript-heavy) в UIWebView, и я хочу добавить UIActivityView, чтобы вращаться, пока он думает.UIWebView заканчивается слишком быстро

Проблема заключается в том, что метод - (void)webViewDidFinishLoad:(UIWebView *)webView вызывается довольно долго, прежде чем рендеринг действительно произойдет. Достаточно, чтобы мой прядильщик (который спрятался, когда остановился) никогда не появлялся. К тому моменту, когда пользовательский интерфейс даже собран, счетчик уже был остановлен и скрыт, хотя есть достаточно времени, чтобы подумать, не сломано ли оно до того, как UIWebView фактически доставит товары на экран.

Я хотел было «webViewDidFinishRendering», но это будет означать, что WebKit это нечто иное, чем lickedy-сплит быстрого ... ;-)

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

ответ

4

Вот как я обрабатывать случаи, когда мне нужно, чтобы убедиться, что страница полностью загружена: Добавить яваскрипт обработчик для события document.onload, что делает что-то вроде этого:

function onDocumentLoad() { 
    window.location.href = 'myapp://loaded'; 
} 

Затем в UIWebViewDelegate, вы можете сделать это:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
    if ([[request.URL absoluteString] isEqual:@"myapp://loaded"]) { 
     [activityIndicator stopAnimating]; 
     return NO; 
    } 
    return YES; 
} 
+0

Уход! Я попробую! –

+0

К сожалению, это срабатывает прямо, когда метод webViewDidFinish .... И потом, через несколько секунд WebView завершает рендеринг карты. –

+0

Вы говорите, что страница javascript тяжелая. Задержка рендеринга вызвана javascript, который выполняется, когда DOM или страница заканчивает загрузку? Если это так, возможно, есть еще одна точка, в которой вы можете ввести назначение window.location.href, чтобы остановить ваш счетчик в последний момент. Например, если вы загружаете данные асинхронно через AJAX, вероятно, есть некоторый обратный вызов javascript, который запускается, когда данные заканчивают загрузку. Это просто вопрос правильного выбора кода для вашего конкретного контента. – cduhn

0

Да, как вы уже нашли, webViewDidFinishLoad сообщает вам, когда данные были загружены в представление, но не дает никакой информации о том, что JS может происходить после этого. К сожалению, UIWebView довольно ограничен. Лучшее, что вы, вероятно, можете сделать, это опросить его с помощью запроса JS через stringByEvaluatingJavaScriptFromString. Если вы можете запустить JS, чтобы проверить, закончены ли все в веб-представлении, вы можете делать это каждые полсекунды и отклонять счетчик, когда получите положительный результат.

Смежные вопросы