2011-01-14 38 views
13

Tengo un UIWebView que carga una página HTML. Esta página tiene dos botones, digamos Exit y Submit. No deseo que los usuarios puedan hacer clic en el botón Salir, por lo que una vez que la página ha terminado de cargarse (es decir, se llama al webViewDidFinishLoad), utilizo stringByEvaluatingJavaScriptFromString para eliminar uno de estos botones, manipulando el HTML. También deshabilito la interacción del usuario en el UIWebView en webViewDidStartLoad, y lo habilito de nuevo en webViewDidFinishLoad.Determinar cuándo ha finalizado stringByEvaluatingJavaScriptFromString

El problema que estoy descubriendo es que stringByEvaluatingJavaScriptFromString tarda uno o dos minutos en completarse, y parece que está hecho en su propio hilo. Entonces, lo que está sucediendo es que se llama webViewDidFinishLoad, la interacción del usuario está habilitada en el UIWebView, y si el usuario es rápido, puede hacer clic en el botón Salir antes de que stringByEvaluatingJavaScriptFromString haya finalizado. Como stringByEvaluatingJavaScriptFromString parece estar en su propio hilo sin forma de saber cuándo está terminado (no llama al webViewDidFinishLoad), la única forma de evitar por completo que los usuarios toquen el botón Salir que puedo ver es habilitar solo la interacción del usuario en UIWebView después un poco de retraso, que no es confiable (¿cómo puedo saber realmente por cuánto tiempo me demoraré?).

¿Estoy en lo correcto porque stringByEvaluatingJavaScriptFromString está hecho en el hilo, y no tengo manera de saber cuándo está terminado? ¿Alguna otra sugerencia sobre cómo solucionar este problema?

EDIT: En resumen, lo que quiero saber es si es posible desactivar un UIWebView mientras stringByEvaluatingJavaScriptFromString se está ejecutando, y volver a habilitar el UIWebView cuando se termina el javascript.

EDIT 2: Hay un artículo aquí, que parece dar a entender de alguna manera puede sondear el motor de JS para ver cuando esté terminado, pero no puedo encontrar ninguna otra referencia diciendo lo mismo: http://drnicwilliams.com/2008/11/10/to-webkit-or-not-to-webkit-within-your-iphone-app/

EDIT 3 Basado en la respuesta de Brad Smith, parece que realmente necesito saber cuándo UIWebView ha terminado de cargarse después de que se haya ejecutado javascript. Se ve cada vez más como que necesito poner un retraso de algún tipo allí.

+2

mismo problema aquí! ¿Cuál fue tu solución? –

+0

Creo que tuve que recurrir a solo asumir que tomaría una cierta cantidad de tiempo, y retrasando mi procesamiento por al menos ese período de tiempo. –

+1

Mismo problema. Ay, tiene que haber una mejor manera de hacer esto. –

Respuesta

2

Puede tener el javascript que está inyectando en la página, intentar navegar por la página (document.location = "foo") y usar webView: ShouldLoadRequest: para buscar esa solicitud y devolver no tan bien como desencadenar lo que necesita (y normalmente regresa sí).

+0

Hmm, interesante. Suena como una solución horrible, pero podría funcionar ... –

+0

Lamentablemente, esto no parece funcionar para mí. Pulsé la llamada a document.location al final del javascript que estoy inyectando, pero parece que todavía se llama antes de que el botón Exit haya desaparecido. Parece que el JS ya se ha ejecutado, pero el WebView no ha terminado de manejar los cambios. –

1

stringByEvaluatingJavascriptFromString tiene que hacerse cuando vuelve. Se puede hacer en un hilo diferente (probablemente no, ya que puede cambiar la UI), pero el método no puede devolver el resultado de la cadena hasta que tenga un resultado que devolver.

+0

Sí, me doy cuenta de que el javascript no se puede hacer hasta que la vista web regrese. Por favor vea mi pregunta editada para aclarar lo que estoy preguntando. –

2

Después de ejecutar stringByEvaluatingJavascriptFromString, se puede tratar a continuación el código para resolver su problema

webView.userInteractionEnabled = NO; 
while (webView.loading) { 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]]; 
} 
webView.userInteractionEnabled = YES; 

Avísame su trabajo para usted o no.

2

¿Qué hay de la creación de una función de código auxiliar para el evento onclick directamente en el elemento html. Puede vincular el elemento html a una función de controlador de eventos onclick más adelante cuando sea más apropiado.

<button onclick="function() { };"/> 
Cuestiones relacionadas