2009-07-18 6 views
6

estoy construyendo una aplicación que mostrará algunos boletines informativos para los usuarios. los boletines se muestran en uiWebView. Estoy leyendo las URL de los boletines de un feed de rss. Analizo el xml, y en una vista de tabla tengo todos los boletines. Cuando se hace clic en una celda, se empuja uiWebView y se carga el boletín. Debido a que uiWebView no abre enlaces que tienen target = _blank, necesito reemplazar el _blank del objetivo con "". En una NSOperation i descargar el contenido del html y después de que termine la descarga Tengo que cambiar las cuerdas de esta manera:UIWebView carga cadena html analizada

NSMutableString *page = [[[NSMutableString alloc] initWithData:pageData encoding:NSISOLatin1StringEncoding] autorelease]; [page replaceOccurrencesOfString:@"target=_blank" withString:@"target=""" options:0 range:NSMakeRange(0, [page length])]; 

después hago esto me carga la cadena analizada en la web View para mostrarlo al usuario.

[myWebView loadHTMLString:page baseURL:[NSURL URLWithString:@""]]; 

mientras que el NSOperation es descargar el contenido de la página de un HUD con un indicador de actividad y una etiqueta que dice La carga se mostró. Cuando finaliza la descarga, el HUD se elimina de la supervista.

Hasta ahora todo bien ... pero aquí vienen las preguntas. utilicé NSOperation con la función de devolución de llamada porque no pude determinar la última llamada a webDidFinishLoading (leí esto UIWebView - How to identify the "last" webViewDidFinishLoad message? - esto es parte de mi problema, pero la respuesta fue utilizar algunas clases privadas de Apple y eso es un problema para yo). por lo que estoy haciendo esto:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { 


NSURL *url = request.URL; 
NSString *urlString = url.absoluteString; 
NSLog(@"WebViewSouldStartWithRequest: %@", urlString); 
if (navigationType == UIWebViewNavigationTypeLinkClicked) 
{ 
    if(![urlString isEqualToString:@"about:blank"]) 
    { 
     NSLog(@"FeedViewController: startPageLoad"); 
     activityHud = [[HUDView alloc] initWithFrame:CGRectMake(110, 100, 80, 80)]; 
     [activityHud setText:@"Loading"]; 
     [myWebView addSubview:activityHud]; 
     NSLog(@"FeedViewController: pageUrl = %@", urlString); 
     [self resetWebView]; 
     [urlLoader loadPageFromUrl:request.URL withCallbackTarget:self withCallbackSelector:@selector(endLoading:)]; 
    } 
} 

return NO; 

}

- (void) endLoading:(NSMutableString *)page { [self resetWebView]; NSLog(@"FeedViewController: endLoading"); [activityHud removeFromSuperview]; [myWebView loadHTMLString:page baseURL:[NSURL URLWithString:@""]]; } 

después toco una celda en la vista de tabla y el boletín se muestra parece que debería, cuando hago clic en un enlace en el boletín , la página está cargada con la nueva solicitud, analizada pero visualmente no está buscando como debería (miré la página después de analizar en NSLog y tiene los estilos css y etiquetas html, cabeza, cuerpo abierto y cerrado correctamente) cualquiera tenía esto problema con uiWebView, no muestra las páginas web correctamente?

Traté de cargar la página con - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{ return YES; } y - (void) webViewDidFinishLoad: (UIWebView *) vistaweb {} y en - webViewDiStartLoad

pero los métodos están siendo llamados para cada artículo que está cargado en la vista web por lo que mostrar y ocultar el HUD en esos métodos no es una buena solución.

me encontré con algunos problemas durante el uso de - (BOOL) web View: (UIWebView *) shouldStartLoadWithRequest web View: (NSURLRequest *) Solicitud de navigationType: (UIWebViewNavigationType) navigationType {...} devuelve ningún

por ejemplo, vínculos que tienen caminos como este/Bilder-galerien a no funcionan y en NSLog recibo este para ellos

esquema desconocido, sin hacer nada: /Bilder-galerien

pero WH yo uso en

  • (BOOL) web View: (UIWebView *) shouldStartLoadWithRequest web View: (NSURLRequest *) Solicitud de navigationType: (UIWebViewNavigationType) {return navigationType Sí} y didstartLoading y finishLoading las direcciones URL se cargan y que no sé ¿por qué ...

Otro problema son los caracteres especiales de alemán ..en mi primera carga (después de presionar una celda en uiTableView) la página es analizada como debería ser por uiWebView pero después de hacer clic en un enlace y la solicitud correspondiente se carga también los caracteres no se analizan correctamente ...

lata ¿Alguien me señala la buena dirección? gracias de antemano

+0

¡Deja de responder tu propia pregunta una y otra vez! – SK9

+1

@ SK9: eliminó las respuestas ... pero la próxima vez, ¡por favor, ofrezca una respuesta a la pregunta si puede! –

Respuesta

4

UIWebView no abre enlaces target = "_ blank". Ciertos enlaces no desencadenan eventos UIWebViewNavigationTypeLinkClicked. Esto sucede cuando el enlace tiene el atributo target = "_ blank".

Para solucionar este problema, he usado el código siguiente. Inyecta algunos javascript después de la carga de la página para eliminar el atributo de destino de todos los enlaces. Después de usar este código, ya no necesité analizar el origen html y reemplazar _blank con _self por ejemplo.

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
     NSString *js = @"\ 
     var d = document.getElementsByTagName('a');\ 
     for (var i = 0; i < d.length; i++) {\ 
      if (d[i].getAttribute('target') == '_blank') {\ 
       d[i].removeAttribute('target');\ 
      }\ 
     }\ 
     "; 

     [webView stringByEvaluatingJavaScriptFromString:js]; 
} 
3

me gusta la respuesta Sorina, podemos hacerlo aún mejor por:

  • evitar obstruir con javascript var d
  • como sabemos que nos estamos quedando motor WebKit que puede utilizar selectores:

... así que en su método de protocolo UIWebViewDelegate invoque el código js:

- (void) webViewDidFinishLoad: (UIWebView *) webView { 
    [webView stringByEvaluatingJavaScriptFromString: @"(function($){for(var i=0;i<$.length;++i){$[i].removeAttribute('target')}})(document.querySelectorAll('a[target=_blank]'))"]; 
} 
Cuestiones relacionadas