Tengo una aplicación que usa UIWebViews
en varios controladores de vista. El UIWebViews
se utiliza para procesar html generado localmente, no se requiere un acceso de red lento.Deferir viewWillAppear until webViewDidFinishLoad
Para guardar la memoria, solo la carga a petición, como lo indica el control de vista viewWillAppear
de devolución de llamada. (Y descargue instancias fuera de pantalla en respuesta a los mensajes didReceiveMemoryWarning
.)
El problema es que el usuario puede ver el html que se está procesando, a veces acompañado de flashes de estilo y otros artefactos desagradables surtidos. Preferiría que la representación se realice fuera de la pantalla y revelar la vista completa cuando esté lista.
Sería muy ordenado poder hacer que el viewWillAppear
no regrese hasta que el UIWebView esté completamente renderizado. ¿Pero cómo?
Digo al UIWebView
qué procesar enviándole un mensaje de loadHTMLString:baseURL:
. Esto es asincrónico, y en algún momento (pronto) más tarde se vuelve a llamar al delegado de la vista web webViewDidFinishLoad
.
Experimenté con ejecutar un runloop dentro de viewWillAppear
, ejecutando NSDefaultRunLoopMode
o UITrackingRunLoopMode
. Esto funciona en el simulador (que se queja en el registro
[Sincronizar CATransaction] llamado dentro de la transacción
pero hace el trabajo), pero en un dispositivo que bloquea al principio, con webViewDidFinishLoad
no ser llamado.
(También, parece que la propiedad de carga UIWebView
no funciona. Por lo menos, después de que yo llamo loadHTMLString:baseURL:
y antes de obtener la devolución de llamada no es cierto.)
La propiedad "cargar" funciona, pero la carga solo se desencadena una vez que UIWebView está en la pantalla (si rastreas 'webViewDidStartLoad' y' webViewDidFinishLoad'). Las sugerencias tienden a decir "agréguela a la pantalla con una opacidad de 0.01", pero eso no ayuda con un controlador de visualización que aún no se muestra en la pantalla .... –