2010-12-03 26 views
17

Tengo un navegador web básico implementado utilizando un UIWebView. Me he dado cuenta de que para algunas páginas, no se llama a ninguno de los métodos UIWebViewDelegate.UIWebView: webViewDidStartLoad/webViewDidFinishLoad métodos de delegado no invocados al cargar ciertas URL

Una página de ejemplo en la que esto sucede es: http://www.youtube.com/user/google. Estos son los pasos para reproducir el problema (asegúrese de insertar NSLog llamadas en UIWebViewDelegate métodos de su controlador):

  1. carga lo anterior URL de YouTube en el UIWebView [aviso de que aquí, los métodos UIWebViewDelegate no consiguen llamar cuando el cargas de la página]
  2. toque la categoría "archivos" en la página
  3. táctil ningún video en esa categoría [tema: aviso de que se carga una nueva página, pero ninguno de los delegados UIWebView se llaman]

Sé que esto no es un problema de que el delegado UIWebView no se haya configurado correctamente, ya que los métodos delegados se invocan al cargar otros enlaces (p. si intenta hacer clic en un enlace que lo lleva fuera de youtube, notará que se están llamando a los métodos de delegado).

Mi intuición inicial fue que podría deberse a que la página se carga utilizando AJAX, que puede no invocar el método de delegado. Pero cuando revisé Safari del iPhone, no presentaba este problema, así que debe ser algo de mi lado.

También he notado que Three20's TTWebController tiene exactamente el mismo problema que el que tengo.

Pero el problema que surge de este problema es que sin los métodos de delegado denominados, no puedo actualizar la UI para habilitar/deshabilitar los botones de exploración hacia atrás y hacia adelante cuando se cargan nuevas solicitudes.

¿Y por qué sucede esto o cómo puedo solucionarlo para actualizar la UI cuando se realiza una nueva solicitud?

+0

¿Estoy empezando a pensar que esto podría ser un error de iOS? –

+0

No estoy en el cajero automático de mi Mac para intentar solucionar el problema, pero es interesante que hayas mencionado que sucede en alguna página de video. ¿Podría ser que la página mantenga la conexión abierta para la transmisión? Yo propondría que intentes hacer una NSURLRrquest con la URL de la página y ver si la conexión se cierra después de que se carguen los datos HTML. – pmilosev

+0

Oye, ¿alguna vez resolvió este problema? Estoy jugando con m.youtube.com y es una pesadilla. –

Respuesta

20

Esto no es un error de iOS: la página no se está recargando en realidad. Los delegados de UIWebView se activan después de nuevas solicitudes de página, pero esa página no hace eso.

Mire con mucho cuidado en lo que sucede en Safari de escritorio cuando hace clic en el enlace de video en esa página como usted describe. Asegúrate de prestar atención a la barra de direcciones. La dirección cambiará, pero críticamente la página no se volverá a cargar.

Todo esto es manejado por JavaScript, no recargando la página. En pocas palabras, la página nunca se recarga, por lo que no hay motivo para que los delegados de UIWebView se llamen.

Si no me cree, para demostrar de manera concluyente esta prueba, repita los pasos que describe con JavaScript deshabilitado. Notarás que la página se comporta de manera completamente diferente.

+1

Hmm ... interesante. Gracias por tu respuesta. Entonces, ¿cómo se supone que uno se enganche a este tipo de evento cuando JavaScript está involucrado en cambiar la página? Necesito saber que esto sucedió en particular, así que actualizo la disponibilidad de los botones atrás/adelante. Safari parece estar manejándolo correctamente, por lo que debe haber una forma de hacerlo. –

+0

Creo que podrías usar JavaScript para obtener una devolución de llamada cuando sucede? La razón por la que está viendo que el botón Atrás funciona en Desktop Safari es por el hecho de que JavaScript escribe en el historial, dando la impresión de que has recargado la página cuando de hecho has hecho una llamada a AJAX (Google usa esta técnica en GMail todo el tiempo). Supongo que Mobile Safari no está implementando eso como lo hace el escritorio. No soy un experto en JS, así que no sabría por dónde empezar. – lxt

+0

Hmm, no estoy seguro de si eso es lo que realmente está sucediendo aquí. Me estaba refiriendo al Safari móvil en el iPhone, que no muestra ese problema, utilizando exactamente el mismo sitio. Todavía estoy perdido por una explicación. –

1

esto no es una buena solución, pero im utilizando NSTimer para actualizar el estado de los botones:

- (BOOL)webView:(UIWebView *)_webview shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
    if (!_timer && [request.URL.absoluteString rangeOfString:@"youtube.com"].length != 0) { 
     _timer = [NSTimer scheduledTimerWithTimeInterval:0.5 
                target:self 
               selector:@selector(checkNavigationStatus) 
               userInfo:nil 
               repeats:YES]; 
    } 

    return YES; 
} 

//.... 
//.... 
//.... 

- (void)checkNavigationStatus 
{ 
    // Check if we can go forward or back 
    backButton.enabled = self.webView.canGoBack; 
    forwardButton.enabled = self.webView.canGoForward; 
} 
+0

Esto funciona para mí. – ZYiOS

-3

se parece a esto lo arreglaron en IOS 4.2. Funciona en iOS 4.2.

+4

eso no está bien ... –

+0

Esto no se resolvió con iOS 5.1 – adamdehaven

+0

ni siquiera en 6.1 – sleepwalkerfx

Cuestiones relacionadas