2012-09-30 17 views
9

Reconozco que UITableview carga dinámicamente una celda cuando el usuario se desplaza. Me pregunto si hay una manera de precargar todas las celdas para no cargar cada una mientras se desplaza. Necesito precargar 10 celdas. es posible?Precargar celdas de uitableview

Respuesta

11

Puede inicializar las celdas de la vista de tabla, ponerlas en una matriz precomputedCells y en el método delegado origen de datos tableView:cellForRowAtIndexPath: devolver las celdas precalculadas de la matriz en lugar de llamar al dequeueReusableCellWithIdentifier:. (Similar a lo que haría en una vista de tabla estática.)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return [self.precomputedCells objectAtIndex:indexPath.row]; 
} 

También podría ser útil para echar un vistazo a la WWDC 2012 Sesión 211 "La construcción de interfaces de usuario concurrentes en iOS" donde se demuestra cómo llenar el contenido de las celdas de la vista de tabla en los hilos de fondo mientras se mantiene la interfaz de usuario receptiva.

+0

Como usted ha dicho que salvó a los mis células a un NSMutableArray. Luego los precargo uno por uno a través de [self tableView: tablefollow cellForRowAtIndexPath: indexPath1]; . La vista de uitable no está visible en el momento de la precarga. Después de que uitableview es visible, noto que NSString * CellIdentifier = [NSString stringWithFormat: @ "Cell% i-% i", indexPath.section, [indexPath row]]; UITableViewCell * cell = [aTableView dequeueReusableCellWithIdentifier: CellIdentifier]; me está dando cero! ¿Cómo puedo superar este problema? Supongo que se debe a que uitableview no es visible durante la precarga de las celdas. Estoy en lo correcto? – stefanosn

+0

@stefanosn: Mi idea no era utilizar 'dequeueReusableCellWithIdentifier' en absoluto. He actualizado la respuesta en consecuencia. - * También puede ser que no haya entendido bien tu pregunta *. No creo que puedas forzar la vista de tabla para que realmente * cargue * todas las celdas. Incluso si llama a '[self tableView: ... cellForRowAtIndexPath: ...];' para todas las celdas, la vista de tabla podría descartar las celdas no utilizadas. Solo puede * precomputar * todas las celdas (como se describe en mi respuesta) para que la carga de cada celda se realice más rápidamente. - Espero que esto ayude. –

+0

estaba pensando en precargar las celdas en la vista de uitable para que no tenga que devolver una celda en - (UITableViewCell *) tableView: (UITableView *) aTableView cellForRowAtIndexPath: (NSIndexPath *) indexPath para mejorar el desplazamiento. Entonces esto no es posible ¿no? – stefanosn

0

Cambiar el dequeueReusableCellWithIdentifier cuando se va a reutilizar la vista de tabla de lo contrario se cargará los datos antiguos

9

que estaba buscando una solución a la pregunta original y pensé que me gustaría compartir mi solución.

En mi caso, solo tenía que precargar la siguiente celda (no entraré en el motivo, pero había una buena razón).

Parece que UITableView representa tantas celdas como caben en el marco de UITableView asignado a ella.

Por lo tanto, sobredimensioné la trama UITableView por la altura de 1 celda extra, empujando la región sobredimensionada fuera de la pantalla (o podría estar en una UIView recortada si fuera necesario). Por supuesto, esto ahora significaría que cuando recorrí la vista de tabla, la última celda no sería visible (porque el marco de UITableView es más grande que su superview). Por lo tanto, agregué una UIView adicional a tableFooterView de la altura de una celda. Esto significa que cuando la tabla se desplaza hacia abajo, las últimas celdas se ubican muy bien en la parte inferior de su supervista, mientras que la tabla agregada FooterView permanece fuera de la pantalla.

Esto, por supuesto, se puede aplicar a cualquier número de celdas. Incluso debería ser posible aplicarlo para precargar TODAS las celdas si fuese necesario al sobredimensionar el marco de UITableView al contenido iOS originalmente calculado, y luego agregar una tablaFooterView del mismo tamaño.

Esperemos que esto ayude a alguien más con el mismo problema.

+0

Esto parece una buena solución. Desafortunadamente no funciona con tablas paginadas. –

+0

¡La clave de las celdas de precarga es su solución! –

+0

Esta es la única solución, hasta el día de hoy. Aunque esto es solo una buena idea si sabe que la altura de su mesa o vista de colección no será demasiado grande, de lo contrario terminará con problemas de memoria y rendimiento. –

1

Según lo sugerido por Mark, también cambié la altura de mi UITableView temporalmente para que la vista de tabla cree suficientes celdas reutilizables. Luego restablezco la altura de mi vista de tabla para que deje de crear celdas reutilizables mientras se desplaza.

Para lograr eso creo un bool ayudante que se establece en false por defecto:

var didPreloadCells = false 

Se establece en true cuando mi vista de tabla vuelve a cargar primero los datos y por lo tanto creó las primeras células reutilizables.

resultsHandler.doSearch { (resultDict, error) -> Void in 
    [...] 

    self.tableView.reloadData() 

    self.didPreloadCells = true 

    [...] 
} 

El verdadero truco ocurre en mi método viewDidLayoutSubviews. Aquí configuro el marco de mi vista de tabla dependiendo de mi booleano. Si las celdas reutilizables aún no se crearon, aumente el marco de la vista de tabla.En el otro caso, me puse el cuadro normal

override func viewDidLayoutSubviews() { 

    super.viewDidLayoutSubviews() 

    self.tableView.frame = self.view.bounds 

    if !didPreloadCells 
    { 
     self.tableView.frame.size.height += ResultCellHeight 
    } 
} 

Con la ayuda de este punto de vista la tabla crea más células reutilizables iniciales de lo normal y el desplazamiento es suave y fluida, porque no hay células adicionales necesitan ser creados.

-2

Solución para el ajuste automático de celdas. Cambio 'estimatedRowHeight' al valor inferior

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.tableView.rowHeight = UITableViewAutomaticDimension; 
    self.tableView.estimatedRowHeight = 32; //Actual is 64 
} 

altura estimada actual es 64. 32 se utiliza para añadir más células para su reutilización para evitar retraso cuando se desplaza comienza

Cuestiones relacionadas