XCode: UIWebView



Si quieres cargar contenidos web de forma fácil en iOS la respuesta es UIWebView. Pero no sólo eso, también vale para cargar texto formateado de forma fácil y rápida. Y además con la ventaja de que no os tenéis que preocupar por si el texto no cabe ya que permite hacer scroll.

Lo puedes añadir desde Interface Builder o crear una instancia en código:



UIWebView *webView = [[UIWebView alloc] init];

Desde Interface Builder puedes seleccionar que detecte varios tipos de datos (Links, números de teléfono, direcciones...) de forma que si aparece uno al seleccionarlo se producirá la acción correspondiente (p.ej. si es un número de teléfono se realizará una llamada a ese número). También da la opción de escalar la página al View, lo cual suele ser interesante para código HTML que no se adapte automáticamente.



Para cargar una página web externa:


  NSURL *url = [NSURL URLWithString:"www.direcciondemiweb.com"];
  NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
  [webView loadRequest:requestObj];

Para cargar código HTML directamente desde un NSString:

NSString* htmlString = @"<h2>Título</h2><p>Algo de texto</p>";
[webView loadHTMLString:htmlString baseURL:nil];


Para cargar una página desde un archivo local:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"mi_pagina" ofType:@"html"];
NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
[webView loadHTMLString:htmlString baseURL:baseURL];


Y si queréis cargar alguna imagen local lo podéis hacer así:

<img src="mi_imagen.png">

Además tiene un delegate (UIWebViewDelegate) que podéis implementar y os informa del estado de la operación de cargar una web (p.ej. si ha habido error, si se ha cargado correctamente...).

Y juntando una cosa con la otra surge un hack muy útil (definiendo hack como dar un uso alternativo a una funcionalidad para conseguir una solución práctica a un problema):

Supongamos que nos conectamos a un servidor y este nos devuelve datos de texto pero formateados en html y/o unicode (p.ej. con etiquetas o códigos de caracteres: <b>, \u00d1...). Y los queremos mostrar en un UILabel, pero si lo hacemos tal cual, aparecerán esas etiquetas y códigos. Sin embargo sólo nos interesa el texto y si lo puede parsear otro (Homer: "¡que lo haga otro!", en este caso que lo haga el UIWebView) mejor que mejor.

Podemos crear un UIWebView (invisible, no hace falta añadirlo a la vista), cargarle el HTML e implementar el delegate. Y cuando termine de cargar:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSString *textoPlano = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
}