iphone - open - ¿Cómo uso un UIWebView en una celda de tabla?
uiwebview tutorial (7)
¿Ha buscado anular el método -prepareForReuse en la subclase de la celda de la tabla? Si las celdas no parecen actualizarse cuando se desplaza, es posible que el contenido de las celdas reutilizables no se borre y se reinicie.
Estoy creando una tabla con un texto que es HTML, así que estoy usando un UIWebView como una subvista de mis celdas de tabla personalizadas. Ya me encontré con un problema: al desplazarme hacia abajo en la tabla, la actualización de UIWebViews tardaría un segundo. Por ejemplo, estaría viendo celdas en las filas numeradas 1, 2 y 3. Me desplazaría hacia abajo para decir 8, 9 y 10. Por un momento, el contenido de UIWebView que estaba visible en la celda # 8 era el contenido de la celda # 1, el contenido de la celda # 9 fue el de la celda # 2, y así sucesivamente.
Aprendí que el problema era que UIWebViews simplemente mostraba su texto lentamente. Se sugirió, en cambio, precargar el contenido en UIWebView lo antes posible, en lugar de esperar hasta que la tabla reciba el cellForRowAtIndexPath. Así que ahora, tengo un objeto de dominio que antes solo tenía el contenido de texto de WebView, pero ahora tiene una referencia al UIWebView en sí.
Pero ahora parte del contenido de UIWebView se renderiza, y cuando me desplazo por la tabla, UIWebView se muestra solo como un cuadro gris. Si toco el cuadro gris, en realidad recibirá el toque y actualizará la vista web. Por ejemplo, si toco un enlace (lo que puedo o no puedo hacer, ya que el cuadro es gris y sería por un golpe de suerte). La página a la que se enlazó se solicitará y mostrará correctamente.
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
// I suppose this isn''t necessary since I am just getting it from the
// Domain Object anyway
content = [[UIWebView alloc] initWithFrame:CGRectZero];
content.backgroundColor = [UIColor blackColor];
[self addSubview:content];
[content release];
}
return self;
}
// called by cellForRowAtIndexPath
- (void)setMyDomainObject:(MyDomainObject*)anObject {
UIWebView *contentWebView = anObject.contentWebView;
int contentIndex = [self.subviews indexOfObject:content];
[self insertSubview:contentWebView atIndex:contentIndex];
}
Así que aquí está mi respuesta actualizada: he implementado una tabla con un gran UIWebView para colocar texto con estilo dentro de las celdas de la tabla en mi propia aplicación cliente de Twitter, HelTweetica (con la fuente disponible). Funciona bastante bien siempre y cuando entiendas cómo hacer el diseño en HTML y CSS.
Simplemente crea un NSMutableString
y agrega las líneas de HTML que conforman su documento. Puede hacer referencia a archivos externos, como los archivos CSS que se encuentran en el recinto de seguridad de su aplicación. Puede establecer acciones de URL personalizadas, como "youraction: //file.txt", que su delegado de vista web puede interceptar y procesar como una IBAction
reemplazo:
- (void) refreshWebView {
TwitterAccount *account = [twitter currentAccount];
NSMutableString *html = [[NSMutableString alloc] init];
// Open html and head tags
[html appendString:@"<!DOCTYPE html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/" /"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd/">/n"];
[html appendString:@"<html xmlns=/"http://www.w3.org/1999/xhtml/" xml:lang=/"en/" lang=/"en/">/n"];
[html appendString:@"<head>/n"];
[html appendString:@"<meta name=''viewport'' content=''width=device-width'' />"];
[html appendString:@"<link href=''style-ipad.css'' rel=''styleSheet'' type=''text/css'' />"];
[html appendString:@"<script language=''JavaScript'' src=''functions.js''></script>"];
// Body
[html appendString:@"</head><body><div class=''artboard''>"];
// [...]
// Close artboard div, body. and html tags
[html appendString:@"</div></body></html>/n"];
NSURL *baseURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]];
[self.webView loadHTMLString:html baseURL:baseURL];
[html release];
}
Y puedes recargar partes de la página usando javascript:
- (void) refreshTabArea {
NSString *html = [self stringByEscapingQuotes: [self tabAreaHTML]];
NSString *js = [NSString stringWithFormat: @"document.getElementById(/"tab_area/").innerHTML = /"%@/";", html];
[self.webView stringByEvaluatingJavaScriptFromString:js];
}
Esto no es responder a la pregunta original, pero dar un paso atrás y mirar la imagen más grande, si está intentando mostrar un hipervínculo en una celda de la tabla, ¿eso significa que al hacer clic en él se abre un navegador web? ¿Sería lo mismo si mostraras un texto con estilo en la celda de la tabla que parece o insinúa un enlace, pero abres una pantalla separada con una vista de pantalla completa que te permite tocar el enlace?
Según entiendo, una vista web no se procesará a menos que inicie la carga DESPUÉS de que suceda viewDidLoad ().
Si el contenido de la vista web está restringido a texto con estilo o hipervínculos, es posible que desee ver el proyecto Three20: http://github.com/joehewitt/three20/tree/master
Su clase TTStyledText
tiene soporte para las etiquetas <b>, <i>, <img>, and <a>
en el contenido. Probablemente más ligero que las webviews.
Una forma de lidiar con esto sería usar varios UILabels, cada uno con diferentes fuentes. Luego, estratégicamente, colóquelos dentro de la celda para que parezcan texto contiguo. He visto esto hecho en un UITableView con muy buenos resultados.
Otro problema de rendimiento puede ser que esté olvidando UItableViewCell y su método init. Esto casi siempre conduce a un bajo rendimiento en un UITableView. En su lugar, solo use las instancias regulares de UITableViewCell y agregue subvistas a su contentView.
Esto ha sido cubierto ampliamente por el Dibujo personalizado fácil de UITableView de Matt Gallagher.
Otro método descrito fue utilizar Three20, que también puede darle un texto con estilo.
Lo que está intentando actualmente no se puede hacer con UIWebview.
La precarga no ayudará: esto ralentizaría la interfaz de usuario cuando las UIWebviews se representen fuera de la pantalla; Siempre debes practicar la carga perezosa en el iPhone.
Poner UIWebviews en un UITableView vendrá con un impacto de rendimiento potencialmente inaceptable. Necesitará utilizar otros medios para lograr su objetivo.
Desafortunadamente, NSAttributedString no está disponible en UIKit, lo que podría resolver fácilmente su problema.
Usted dijo ''llamado por setRowAtIndexPath'', podría querer decir ''cellForRowAtIndexPath'' que es un método UITableView llamado cuando una fila se hace visible y necesita crear una celda. Asegúrese de que en este método esté inicializando y actualizando correctamente el contenido de la celda.