UIWebView didFinishLoading срабатывает несколько раз
У меня есть код, который нужно запустить после того, как a UIWebView
закончит загрузку документа. Для этого я назначил делегат UIWebView
моему контроллеру и реализовал метод webViewDidFinishLoading
.
Это вызвано несколько раз, в зависимости от типа загружаемой страницы. Я не уверен, что это связано с запросами ajax, запросами на изображения или даже с iframe.
Есть ли способ сказать, что основной запрос завершен, что означает, что HTML полностью загружен?
Или, возможно, задержка моего кода от стрельбы, пока все эти события не будут завершены?
Ответы
Ответ 1
Это может быть просветляющим (если вы еще не зашли так далеко) в NSLog, начинается и заканчивается трассировка загрузки.
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"Loading: %@", [request URL]);
return YES;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"didFinish: %@; stillLoading: %@", [[webView request]URL],
([email protected]"YES":@"NO"));
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
NSLog(@"didFail: %@; stillLoading: %@", [[webView request]URL],
([email protected]"YES":@"NO"));
}
Я просто смотрел призывы ко всем трем в одном из моих проектов, который загружает страницу справки из моего пакета и содержит встроенные ресурсы (внешние css, YUI!, images). Единственный запрос, который приходит, - это загрузка начальной страницы, shouldStartLoadWithRequest
не вызывается для какой-либо из зависимостей. Так любопытно, почему ваш didFinishLoad вызывается несколько раз.
Возможно, то, что вы видите, связано с перенаправлением или, как уже упоминалось, ajax-вызовами на загруженной странице. Но вы, по крайней мере, должны иметь возможность уравнивать вызовы shouldStartLoad
и любую из двух других функций делегата и иметь возможность определить, когда загрузка будет завершена.
Ответ 2
Вы можете сделать что-то подобное, чтобы проверить, завершена загрузка. Поскольку у вас может быть много контента на той же странице, вам это нужно.
- (void)webViewDidFinishLoad:(UIWebView *)webview {
if (webview.isLoading)
return;
// do some work
}
Ответ 3
Проверьте это так просто и просто, чтобы не было необходимости писать слишком много кода:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
if ([[webView stringByEvaluatingJavaScriptFromString:@"document.readyState"] isEqualToString:@"complete"]) {
// UIWebView object has fully loaded.
}
}
Ответ 4
Этот вопрос уже решен, но я вижу, что ему не хватает ответа, который на самом деле объясняет, почему несколько вызовов webViewDidFinishLoad
являются фактически ожидаемым поведением
Вышеупомянутый метод вызывается каждый раз, когда веб-просмотр завершает загрузку кадра. Из документации UIWebViewDelegate:
webViewDidFinishLoad:
Отправляется после того, как веб-просмотр завершает загрузку кадра.
На самом деле это также верно для всех других методов, которые содержат протокол UIWebViewDelegate
.
Ответ 5
Попробуйте это, он будет работать нормально
-(void)webViewDidFinishLoad:(UIWebView *)webview
{
if (webview.isLoading)
return;
else
{
// Use the code here which ever you need to run after webview loaded
}
}
Ответ 6
Это происходит потому, что метод обратного вызова вызывается каждый раз, когда выполняется загрузка кадра. Чтобы предотвратить этот набор, свойство "suppressesIncrementalRendering" веб-представления равно true. это предотвратит рендеринг веб-просмотра до тех пор, пока все данные не будут загружены в память. Это сделало трюк для меня
Ответ 7
Я заметил что-то подобное, и это было путаницей: у меня есть UITabBarController
, он предваряет все ViewControllers
связанные с его вкладками при запуске приложения (несмотря на отображение только first_Tab_ViewController), поэтому, когда несколько вкладок имеют ViewController
с WebView, вызываются их соответствующие webViewDidFinishLoad
, и если я скопировал вставку:
NSLog(@"size width %0.0f height %0.0f", fitingSize.width, fittingSize.height);
в нескольких, я получаю несколько выходов в консоли, которые кажутся двойным вызовом, когда они действительно являются одиночным вызовом в двух разных UIWebViews
.
Ответ 8
Вы можете проверить свойства загрузки и запроса в методе webViewDidFinishLoad
Ответ 9
Возможно, связанная с этим проблема является свойством в UIWebView, представленном в iOS6: suppressesIncrementalRendering
.