iphone - tutorial - wkwebview or uiwebview




UIWebView-Как определить последнее сообщение webViewDidFinishLoad? (7)

hi это может быть немного далеко назад, но я надеюсь, что это поможет.

я просто использовал уведомление, когда он входит в метод webViewDidFinishLoad, так что я могу захватить один экземпляр метода, а затем я обнаружу уведомление и сделаю свою логику оттуда.

надеюсь это поможет. он не захватывает последний вызванный экземпляр метода webViewDidFinishLoad, но позволяет вам что-то делать, когда он был вызван, а не повторять вызовы этого конкретного метода (например, показывая кнопку).

** * ** * *** EDIT * ** * ** * **

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

В качестве альтернативы, я думаю, вы можете сделать счетчик по методу делегирования webViewDidStartLoad, а также на webViewDidFinishLoad, чтобы убедиться, что они одинаковы, прежде чем запускать ваши коды. это, однако, является уродливым взломом, поскольку мы никогда не узнаем, сколько раз он будет вызван, если только я не загружаю html-канал и вы можете добавить JavaScript, чтобы проверить, сколько элементов на странице, которую вы загружаете. Я просто использую некоторые из методов, которые я пытался решить. Надеюсь, поможет.

обратная связь поощряется. благодаря!

Сообщение webViewDidFinishLoad, кажется, отправляется каждый раз, когда загружается любой объект на странице. Есть ли способ определить, что вся загрузка контента выполняется?


Вот что я использую, чтобы показать прядильщик, когда DOM загружается, построенный поверх ответа @ Vinod.

Обратите внимание, что между webViewDidStartLoad и webViewDidFinishLoad readyState завершается из предыдущего запроса (если есть), поэтому опрос должен начинаться после webViewDidFinishLoad .

readyState возможные значения загружаются , интерактивны или завершены (и, возможно, ноль ?)

- (void)webViewDidStartLoad:(UIWebView *)webView {
    [self spinnerOn];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self startDOMCompletionPolling];
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    [self startDOMCompletionPolling];
}


- (void)startDOMCompletionPolling {
    if (self.domCompletionListener) {
        [self.domCompletionListener invalidate];
    }
    self.domCompletionListener = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(checkDOMCompletion) userInfo:nil repeats:YES];
}

- (void)checkDOMCompletion {
    NSString *readyState = [self.webView stringByEvaluatingJavaScriptFromString:@"document.readyState"];

    if (readyState != nil) {
        if (readyState.length > 0) {
            if ([readyState isEqualToString:@"loading"]) { //keep polling
                return;
            }
        }
    }
    //'completed', 'interactive', nil, others -> hide spinner
    [self.domCompletionListener invalidate];
    [self spinnerOff];
}

Вы также можете использовать эту короткую статью I, которая добавляет блоки в UIWebView, а также позволяет выбирать между поведением по умолчанию UIWebView (получение уведомления после каждой загрузки объекта) или «ожидаемое» поведение (получение уведомления только при полной загрузке страницы).

https://github.com/freak4pc/UIWebView-Blocks


Другой способ отслеживать прогресс загрузки с меньшим контролем - наблюдать уведомления WebViewProgressEstimateChangedNotification, WebViewProgressFinishedNotification и WebViewProgressStartedNotification. Например, вы можете наблюдать за этими уведомлениями, чтобы реализовать простой индикатор прогресса в своем приложении. Вы обновляете индикатор прогресса, вызывая метод оценочногоProgress, чтобы получить оценку количества загружаемого содержимого.

из http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/WebKit/Classes/WebView_Class/Reference/Reference.html


Как я это делаю:

- (void)webViewDidFinishLoad:(UIWebView *)webview  {
    if (webview.loading)
    return;
    // now really done loading code goes next
    [logic]
}

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

Это сработало для меня:

- (void) webViewDidFinishLoad:(UIWebView *)webView {
    NSString *valueID = [webView stringByEvaluatingJavaScriptFromString:@"document.valueID;"];

    if([valueID isEqualToString:@""]){
        [webView reload];
        return;
    }

    //page loaded
}

Я предполагаю, что webViewDidStartLoad webViewDidFinishLoad пару webViewDidStartLoad / webViewDidFinishLoad .

[webView isLoading] упомянутая в качестве ответа, не работала для меня; он возвратил false даже после первого из двух вызовов webViewDidFinishLoad . Вместо этого я отслеживаю загрузку следующим образом:

- (void)webViewDidStartLoad:(UIWebView *)webView {
  webViewLoads_++;
}


- (void)webViewDidFinishLoad:(UIWebView *)webView {
  webViewLoads_--;

  if (webViewLoads_ > 0) {
    return;
  }

  …
}

- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error {
  webViewLoads_--;
}

(Обратите внимание, что это будет работать только в том случае, если стартовые / готовые пары не появятся серийно, но по моему опыту до сих пор этого не произошло).





uiwebview