ViewWillAppear jusqu'à webViewDidFinishLoad report
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.