Question

J'ai une application qui utilise UIWebViews dans plusieurs contrôleurs de vue. Les UIWebViews sont utilisés pour rendre html généré localement, pas d'accès au réseau lent nécessaire.

Pour économiser de la mémoire que je charge que ceux-ci sur la demande que vous y êtes invité par le rappel viewcontroller de viewWillAppear. (Et décharger offscreen cas en réponse à didReceiveMemoryWarning messages.)

Le problème est que l'utilisateur obtient pour voir le code html étant rendu, parfois accompagnée d'éclairs de style et d'autres objets désagréables assortis. Je préférerais le rendu être fait hors-champ, et révèlent la façon pleinement rendu quand il est prêt.

Il serait très bien rangé pour être en mesure d'avoir le viewWillAppear ne reviendra pas jusqu'à ce que le UIWebView est complètement rendu. Mais comment?

Je dis au UIWebView quoi rendre en lui envoyant un message loadHTMLString:baseURL:. Ceci est asynchrone, et un peu de temps (bientôt) plus tard, le délégué du WebView est appelée retour webViewDidFinishLoad.

I expérimenté avec l'exécution d'un runloop intérieur viewWillAppear, exécutant le NSDefaultRunLoopMode ou UITrackingRunLoopMode. Cela fonctionne dans le simulateur (il se plaint au journal

  

[CATransaction synchronisation] appelé à l'intérieur de transaction

mais fonctionne), mais sur un appareil, il DEADLOCKS, avec webViewDidFinishLoad jamais appelé.

(, il semble aussi que la propriété de chargement UIWebView ne fonctionne pas. Au moins, après que je l'appelle loadHTMLString:baseURL: et avant d'obtenir le rappel, il est pas vrai.)

Pas de solution correcte

Autres conseils

Beaucoup de solutions ici je pense. Un rapide est de charger votre UIWebView avec sa propriété cachée YES. Ensuite, réglez votre UIViewController en tant que délégué UIWebViews et mettre en œuvre:

- (void)webViewDidFinishLoad:(UIWebView *)webView

où vous définissez la propriété à NO.

Une chose à noter est que webViewDidFinishLoad va tirer plus d'une fois si vous avez du contenu encadré / embedded. Donc, vous devez garder une trace de cela. Ne devrait pas vraiment être un problème si vous chargez un contenu local.

J'aime la solution de monowerker mieux, mais une autre solution serait de tenir sur le déjà rendu UIWebView tout le temps (dans un objet plus permanent que le contrôleur de vue). Je ne le fais que si l'aspect de la solution de monowerker est trop perturbateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top