iphone - type - wkwebview ios
La aplazamiento de la vista se mostrarĂ¡ hasta webViewDidFinishLoad (2)
Tengo una aplicación que usa UIWebViews
en varios controladores de vista. Las UIWebViews
se utilizan para procesar html generado localmente, no se requiere acceso lento a la red.
Para guardar la memoria, solo los cargo a pedido, como lo indica la vista viewWillAppear
callback. (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 variados. 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 la vista viewWillAppear
no regrese hasta que UIWebView esté completamente renderizada. ¿Pero cómo?
Le digo a UIWebView
qué representar enviándole un loadHTMLString:baseURL:
message. Esto es asincrónico, y en algún momento (muy pronto) después, el delegado de la vista web recibe la llamada webViewDidFinishLoad
.
Experimenté con ejecutar un runloop dentro de viewWillAppear
, ejecutando ya sea NSDefaultRunLoopMode
o UITrackingRunLoopMode
. Esto funciona en el simulador (se queja al registro
[CATransaction synchronize] llamado dentro de la transacción
pero funciona) pero en un dispositivo se webViewDidFinishLoad
nunca se llama a webViewDidFinishLoad
.
(Además, parece que la propiedad de carga de UIWebView
no funciona. Al menos, después de llamar a loadHTMLString:baseURL:
y antes de obtener la devolución de llamada no es cierto).
Me gusta mejor la solución de Monowerker, pero otra solución sería mantener el UIWebView ya renderizado todo el tiempo (en un objeto más permanente que el controlador de vista). Solo lo haría si el aspecto de la solución de Monowerker es demasiado perturbador.
Muchas soluciones aquí, creo. Uno rápido es cargar su UIWebView con su propiedad oculta establecida en SÍ. Luego configure su UIViewController como el delegado de UIWebViews e implemente:
- (void)webViewDidFinishLoad:(UIWebView *)webView
donde estableces la propiedad a NO.
Una cosa a tener en cuenta es que webViewDidFinishLoad se activará más de una vez si tiene contenido enmarcado / incrustado. Entonces tienes que hacer un seguimiento de esto. Realmente no debería ser un problema si está cargando contenido local.