Ho un'applicazione che utilizza UIWebViews
in diversi controller di vista. Lo UIWebViews
viene utilizzato per il rendering di html generato localmente, non è richiesto un accesso lento alla rete.Rimandare viewWillAppear fino a webViewDidFinishLoad
Per risparmiare memoria, li carico solo su richiesta, come richiesto dal callback del viewcontroller viewWillAppear
. (E scaricare le istanze fuori schermo in risposta ai messaggi didReceiveMemoryWarning
.)
Il problema è che l'utente può vedere il rendering del codice HTML, a volte accompagnato da bagliori di stile e altri artefatti spiacevoli assortiti. Preferirei molto che il rendering fosse fatto fuori dallo schermo e rivelasse la vista completamente renderizzata quando è pronta.
Sarebbe molto ordinato di essere in grado di restituire viewWillAppear
fino a quando UIWebView non sarà completamente visualizzato. Ma come?
Dico allo UIWebView
cosa inviare inviandolo un messaggio loadHTMLString:baseURL:
. Questo è asincrono, e qualche volta (presto) più tardi il delegato della webview viene richiamato webViewDidFinishLoad
.
Ho provato a eseguire un runloop all'interno di viewWillAppear
, eseguendo il NSDefaultRunLoopMode
o UITrackingRunLoopMode
. Questo funziona nel simulatore (si lamenta con il registro
[CATransaction Sincronizza] chiamato all'interno della transazione
ma funziona), ma su un dispositivo che deadlock, con webViewDidFinishLoad
mai essere chiamato.
(Inoltre, sembra che la proprietà di carico UIWebView
non funziona. Almeno, dopo che io chiamo loadHTMLString:baseURL:
e prima di ottenere la richiamata non è vero.)
La proprietà "loading" funziona, ma il caricamento viene effettivamente attivato solo quando UIWebView è sullo schermo (se si traccia 'webViewDidStartLoad' e' webViewDidFinishLoad'). I suggerimenti tendono a dire "aggiungilo allo schermo con un'opacità di 0,01", ma questo non aiuta un controllore di vista che non è ancora sullo schermo .... –