Подтвердить что ты не робот

UIWebView didFinishLoading срабатывает несколько раз

У меня есть код, который нужно запустить после того, как a UIWebView закончит загрузку документа. Для этого я назначил делегат UIWebView моему контроллеру и реализовал метод webViewDidFinishLoading.

Это вызвано несколько раз, в зависимости от типа загружаемой страницы. Я не уверен, что это связано с запросами ajax, запросами на изображения или даже с iframe.

Есть ли способ сказать, что основной запрос завершен, что означает, что HTML полностью загружен?

Или, возможно, задержка моего кода от стрельбы, пока все эти события не будут завершены?

4b9b3361

Ответ 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.