Pregunta

Estoy construyendo una tabla con un texto que es HTML, así que estoy usando un UIWebView como una subvista de mi costumbre de celdas de la tabla.Yo ya se ejecutó en un problema - como me desplaza hacia abajo en la tabla, se necesitaría el UIWebViews un segundo para actualizar.Por ejemplo, me gustaría ser la visualización de las Células en las filas numeradas 1, 2, y 3.Me gustaría desplácese hacia abajo para decir 8, 9, y 10.Por un momento, el contenido de la UIWebView que era visible en la celda #8 era el contenido de la celda #1, el contenido en la celda #9 fue que a partir de la celda #2, y así sucesivamente.

Me enteré de que el problema era que UIWebViews simplemente hacen que su texto lentamente.Se sugirió que en lugar de la precarga del contenido en el UIWebView tan pronto como pude, en lugar de esperar hasta que la tabla recibe el cellForRowAtIndexPath.Así que ahora, tengo un Dominio de Objetos que antes sólo tenía el contenido del texto de la WebView - pero ahora lo que realmente tiene una referencia a la UIWebView sí mismo.

Pero ahora algunos de los contenidos en la UIWebView hace, y cuando me desplazo a través de la mesa de la UIWebView muestra sólo como un cuadro gris.Si me toca la casilla gris, realmente va a recibir el toque y la actualización de la WebView - por ejemplo, si me toca un enlace (que puede o no puede hacer, ya que el cuadro es de color gris y sería por un golpe de suerte), la página a la que estaba vinculada a la que se solicita y se muestran 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];
}
¿Fue útil?

Solución

Una forma de lidiar con esto sería usar varios UILabels, cada uno con diferentes fuentes. Luego, colóquelos estratégicamente dentro de la celda para que parezcan texto contiguo. He visto esto en UITableView con muy buenos resultados.

Otro problema de rendimiento puede ser que esté anulando 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 fácil de personalizar de UITableView < a>.

Otro método descrito fue utilizar Three20, que también puede proporcionarle texto con estilo.

Lo que está intentando actualmente no se puede hacer con UIWebview.

La precarga no ayudará: esto ralentizaría la IU cuando las UIWebviews se muestran fuera de la pantalla; siempre debe practicar la carga diferida en el iPhone.

Poner UIWebviews en un UITableView vendrá con un golpe de rendimiento potencialmente inaceptable. Deberá utilizar otros medios para lograr su objetivo.

Desafortunadamente, NSAttributedString no está disponible en UIKit, lo que podría resolver fácilmente su problema.

Otros consejos

Así que aquí está mi respuesta actualizada:He implementado una tabla a través de una gran UIWebView a poner de estilo de texto dentro de las celdas de la tabla en mi propio cliente de Twitter de la aplicación, HelTweetica (con código fuente disponible).Funciona bastante bien siempre y cuando usted entienda cómo hacer el diseño en HTML y CSS.

Usted acaba de crear un NSMutableString y agregar las líneas de código HTML que componen el documento.Puedes referencias de archivos externos, tales como archivos CSS que están en el entorno limitado de la aplicación.Puede establecer la dirección URL personalizada acciones tales como "youraction://file.txt" que tu web ver delegado puede interceptar y procesar como un reemplazo IBActions:

- (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 se pueden recargar las partes de la página mediante el uso de javascript:

- (void) refreshTabArea {
    NSString *html = [self stringByEscapingQuotes: [self tabAreaHTML]];
    NSString *js = [NSString stringWithFormat: @"document.getElementById(\"tab_area\").innerHTML = \"%@\";", html];
    [self.webView stringByEvaluatingJavaScriptFromString:js];
}

Si el contenido de la vista web está restringido a texto con estilo o hipervínculos, puede echar un vistazo al proyecto Three20: http://github.com/joehewitt/three20/tree/master

Su clase TTStyledText tiene soporte para etiquetas <b>, <i>, <img>, and <a> en el contenido. Probablemente más ligero que las vistas web.

Esto no responde a la pregunta original, pero si retrocede un paso y observa la imagen más grande, si está tratando de mostrar un hipervínculo en una celda de la tabla, eso significa que cuando hace clic en él, se abre un ¿navegador web? ¿Sería lo mismo si mostrara texto con estilo en la celda de la tabla que se parece o sugiere un enlace, pero abre una pantalla separada con una vista web de pantalla completa que le permite tocar el enlace?

Dijiste 'llamado por setRowAtIndexPath', podrías 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.

¿Ha buscado anular el método -prepareForReuse en la subclase de celdas de la tabla? Si las celdas no parecen actualizarse al desplazarse, es posible que el contenido de las celdas reutilizables no se borre y restablezca.

Entiendo que un WebView no se procesará a menos que inicie la carga DESPUÉS de que viewDidLoad () ocurra.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top