2010-02-22 12 views
9

En una de mis aplicaciones reutilizo una vista web. Cada vez que el usuario entra en un cierto punto de vista en los datos de recarga en caché a la vista web usando el método: -UIWebView reutilizado que muestra contenido cargado previamente por un breve segundo en el iPhone

- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL

y espero la llamada de devolución de llamada

- (void) webViewDidFinishLoad:(UIWebView *)webView.

Mientras tanto, oculto la vista web y muestro una etiqueta de 'carga'. Solo cuando recibo webViewDidFinishLoad, muestro la vista web.

Muchas veces lo que sucede veo los datos anteriores que se cargó a la vista web por un breve segundo antes de los nuevos datos que he cargado patadas en.

Ya añaden un retardo de 0,2 segundos antes de mostrar la vista web pero no ayudó.

En lugar de resolver esto agregando más tiempo a la demora, ¿alguien sabe cómo resolver este problema o tal vez borrar los datos antiguos de una vista web sin soltarlos y asignarlos cada vez?

Respuesta

11

Gracias malaki1974, en mi caso no estaba usando una vista modal. Cuando me senté con un ingeniero de Apple en la WWDC 2010 y le hice esta pregunta, su respuesta fue simplemente: "No vuelva a utilizar UIWebViews, así no es como debían usarse". Desde entonces me aseguro de llamadas de este conjunto de líneas antes de asignar una nueva UIWebView

[self.myWebView removeFromSuperview]; 
self.myWebView.delegate = nil; 
[self.myWebView stopLoading]; 
[self.myWebView release]; 

que solucionó el problema.

+2

¿De verdad? Eso es algo muy tonto de Apple que hacer teniendo en cuenta que las vistas web son caras de crear – hfossli

+0

Es por eso que quería volver a utilizarlas en primer lugar. Pero el ingeniero de Apple insistió fuertemente en que no estaban destinados a ser reutilizados (al menos en ese momento de la vida cuando acababa de presentar iOS4). Debo admitir que desde que implementé su consejo ya no me encontré con el problema. – Roi

+0

Bueno ... No puedo vivir sin reutilizar teniendo en cuenta lo caro que es. Funciona muy bien para mí usando @ "about: blank" -trick ... – hfossli

1

En primer lugar, UIWebView lo muestra en una cadena de fondo. Incluso cuando recibe webViewDidFinishLoad: puede que no esté completamente hecho. Especialmente si se trata de una página ajax-intense que proviene de la red.

Dice que está escondiendo la vista. Me pregunto si eso significa que la vista web retrasa su dibujo por completo. Lo que podría intentar es mover el UIWebView fuera de pantalla u oscurecerlo con otra vista. Tal vez eso cambie su comportamiento de dibujo.

Si no es necesario un sistema interactivo UIWebView continuación, también se puede considerar que hacerlo por completo fuera de la pantalla en una separada UIWindow y luego crear una imagen de esa capa UIWebView 's.

+0

"no podría hacerse por completo" - ¿Hay una manera de saber cuándo está completamente hecho? – Segev

0

Intente cargar un archivo local que esté en blanco o tenga un gráfico de carga cuando lo oculte, en lugar de simplemente cargar contenido nuevo cuando lo muestre. Como el archivo es local, será rápido e incluso si la página nueva tarda un poco en cargarse, tendrá un espacio en blanco o cargará el comportamiento esperado.

+0

Desafortunadamente, esto no es útil. Incluso loadHTMLString: @ "" tiene suficiente tiempo para ser molesto. –

7

Borrar el contenido de la vista web antes de intentar cargar nuevos contenidos

[self loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
+0

¿Puedes darnos un poco más de explicación sobre este? Esto muestra una vista web vacía ... pero ¿cómo se conecta con el problema de retraso de contenido? – nodepond

+0

Ah, lo entiendo. No se trata de la demora, sino de borrar el contenido antes de mostrar el nuevo. – nodepond

+0

Sí. Esa es la idea. Estoy publicando otra alternativa ahora también. – hfossli

0

Si tienes controll sobre el html. Puede comunicarse nuevamente con objetivo-c cuando el documento esté listo. Al igual que en jQuery:

function messageNative (name, string) { 

    var iframe = document.createElement("IFRAME"); 

    iframe.setAttribute("src", "appscheme://" + name + "/" + string); 
    document.documentElement.appendChild(iframe); 
    iframe.parentNode.removeChild(iframe); 
    iframe = null; 
} 

$(function() { 
    messageNative('webview', 'ready'); 
}); 

Y luego en web View método delegado de UIWebView: shouldStartLoadWithRequest: navigationType: esperar a que la petición con url igual a "appscheme: // WebView/listo". Entonces debe saber: el documento está cargado y listo para mostrarse. Entonces todo lo que falta es un simple fundido de entrada o algo así :)

1

Eso es lo que hago, y funciona:

[_webView stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"]; 
Cuestiones relacionadas