2010-05-06 6 views
1

Je trouve un comportement étrange de UIWebView.UIWebView et JavaScript

Dans le délégué

- (void)webViewDidFinishLoad:(UIWebView *)webView{  
    [self changeFont];  
    //[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(changeFont) userInfo:nil repeats:NO]; 
} 

En changeFont, j'appelle le code JavaScript pour changer la police de la page Web. Il ne sera pas appliqué mais si j'appelle changer la méthode de police après un délai de quelques secondes du délégué webViewDidFinishLoad, il sera appliqué. si les fichiers sont volumineux, comment pouvons-nous déterminer combien de temps webview prendra pour charger si nous devons déclencher le minuteur du délégué webViewDidFinish pour appliquer la taille de police et le style pour le fichier.

aucune explication pour cela. J'ai beaucoup cherché et rien n'est mentionné dans les docs.

Toute aide pourquoi un tel comportement d'UIWebView?

+0

Est-il peut-être [tirer plus d'une fois] (http://stackoverflow.com/questions/1842370/uiwebview-didfinishloading- incendies-plusieurs fois)? –

+0

Non, il ne tire pas plus d'une fois.Il ne tire qu'une seule fois. Ma question est la suivante: pourquoi le délégué est-il appelé lorsque le contenu du récepteur est toujours en cours de chargement?quand le récepteur a le contenu, alors webViewDidFinishLoad devrait être appelé. Dans webViewDidFinishLoad, j'ai coché comme ceci if (myWebView.loading == YES) {NSlog (@ "chargement");} et le journal est imprimé dans la console, cela signifie que la vue web n'est pas chargée et que le délégué est appelé. – ashish

Répondre

0

Essayez d'appeler la méthode "changeFont" sur le thread principal. Comme [self performSelectorInMainThread: ...];

0

Je pense qu'il est parce que la page Web ne peut pas être rendu complètement (je veux dire tous les javascript, les ressources et ainsi de suite) au moment où la méthode - (void)webViewDidStartLoad:(UIWebView *)webView tiré

Ceci explique pourquoi votre méthode fonctionne deuxième fois après un certain délai. Vous pouvez utiliser le rappel depuis javascript vers objectif-c pour déterminer le processus de rendu terminé ou non, plus d'informations sur cette fonctionnalité (ou petit hack) que vous pouvez trouver dans la section: "Javascript communiquer de nouveau avec le code Objective-C "par le lien http://www.codingventures.com/2008/12/using-uiwebview-to-render-svg-files/.

ou utiliser stringByEvaluatingJavaScriptFromString: - J'ai fourni un exemple de l'utiliser dans un autre sujet connexe https://stackoverflow.com/a/8560489/857417

1

Document d'Apple explique que webViewDidFinishLoad et webViewDidStartLoad seront appelés lorsque vous avez terminé/à partir du chargement d'un cadre
Ainsi, après la webViewDidFinishLoad appelé (lorsque le code HTML de base est chargé), il peut y avoir JavaScript ou Ajax dans la page en cours d'exécution. Vous devez attendre que tout soit terminé.

Je suggère deux façons d'essayer:

  1. ajouter un observateur à la propriété de chargement UIWebView
  2. liant JavaScript personnalisé à la page de juger si vous voulez vraiment happend (comme tous les éléments ont la charge) , puis en utilisant JavaScript pour rappeler votre Objective-C

le plus récent est plus puissant lorsqu'il s'agit d'événements personnalisés. Et cette question, je répondais peut aider:

  1. detect YouTube Player event and callback using UIWebView
  2. Javascript callback in Objective-C