52 votes

UIWebView didFinishLoading se déclenche plusieurs fois

J'ai un code qui doit être exécuté après la UIWebView termine le chargement d'un document. Pour cela, j'ai mis l' UIWebViewde déléguée à mon contrôleur, et mis en œuvre l' webViewDidFinishLoading méthode.

Ce qui est appelé plusieurs fois, selon le type de page à charger. Je ne sais pas si c'est à cause de requêtes ajax, les demandes pour les images, ou peut-être même les iframes.

Est-il une façon de dire que la principale demande est terminé, sens le HTML est complètement chargé?

Ou peut-être retarder mon code de cuisson jusqu'à ce que tous ces événements sont faites de tir?

50voto

Scott Densmore Points 981

Vous pouvez faire quelque chose comme ceci pour vérifier quand le chargement est terminé. Parce que vous pouvez avoir beaucoup de contenu sur la même page, vous en avez besoin.

 - (void)webViewDidFinishLoad:(UIWebView *)webview  {
    if (webview.isLoading)
        return;
    // do some work
}
 

48voto

wkw Points 3177

Il pourrait être instructif (si vous n'avez pas passé loin encore) à NSLog une trace de la charge commence et se termine.

    - (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],
            (webView.loading?@"YES":@"NO"));
    }


    - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
       NSLog(@"didFail: %@; stillLoading: %@", [[webView request]URL],
            (webView.loading?@"YES":@"NO"));
    }

Je viens de regarder les appels vers tous les trois dans un de mes projets qui charge une page d'aide de mon bundle et contient des ressources (css externe, YUI!, les images). La seule demande qui vient à travers est le chargement initial de la page, shouldStartLoadWithRequest n'est pas appelée pour toutes les dépendances. Il est curieux de savoir pourquoi votre didFinishLoad est appelée plusieurs fois.

Peut-être ce que vous voyez est due à des redirections, ou comme mentionné, les appels ajax dans une page chargée. Mais vous avez au moins doit être en mesure de la balance des appels d' shouldStartLoad et les deux autres déléguer ses fonctions et être en mesure de déterminer quand le chargement est terminé.

12voto

Vinod Jat Points 1005

Cochez cette option si simple et si simple pour ne pas avoir besoin d’écrire trop de code:

 - (void)webViewDidFinishLoad:(UIWebView *)webView {
        if ([[webView stringByEvaluatingJavaScriptFromString:@"document.readyState"] isEqualToString:@"complete"]) {
            // UIWebView object has fully loaded.
        }
    }
 

8voto

Cezar Points 6222

Cette question est déjà résolue, mais je vois qu'il manque une réponse qui explique d'ailleurs pourquoi plusieurs appels d' webViewDidFinishLoad sont le fait d'un comportement normal

Ladite méthode est appelée à chaque fois que la webview ait fini de charger une image. À partir de la UIWebViewDelegate documentation du protocole:

webViewDidFinishLoad:
Envoyé après un affichage web, des finitions de chargement d'une image.

En fait, cela est également vrai pour toutes les autres méthodes qui comprennent l' UIWebViewDelegate protocole.

2voto

Luis Points 11

J'ai remarqué quelque chose de semblable et c'était une confusion: j'ai un UITabBarController, il semble pour précharger toutes les ViewControllers lié à ses onglets sur le lancement de l'Application (en dépit de montrer juste first_Tab_ViewController), de sorte que lorsque plusieurs onglets ViewController avec WebView respectifs webViewDidFinishLoad sont appelés, et si je l'ai copié collé:

NSLog(@"size width %0.0f height %0.0f", fitingSize.width, fittingSize.height); 

dans plusieurs, je reçois plusieurs de sortie de la console, qui semble être un double appel quand ils sont vraiment à l'appel dans les deux UIWebViews.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X