2010-01-28 10 views
50

De la documentación oficial:iPhone - ¿Qué son reuseIdentifiers (UITableViewCell)?

El identificador de reutilización se asocia con un objeto UITableViewCell que el delegado de mesa vista crea con la intención de volver a utilizarlo como base (por razones de rendimiento) de varias filas de una vista de tabla . Se asigna al objeto de celda en initWithFrame: reuseIdentifier: y no se puede cambiar posteriormente. Un objeto UITableView mantiene una cola (o lista) de las celdas actualmente reutilizables, cada una con su propio identificador de reutilización, y las pone a disposición del delegado en el método dequeueReusableCellWithIdentifier :.

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/reuseIdentifier

no entiendo esto. Bien, entiendo la idea básica, creo, de que cree UITableViewCells, y trate de reutilizar tantas como pueda en lugar de crear nuevas (o algo así). ¿Pero qué decide exactamente si una celda es reutilizable o no? Si tengo dos células idénticas (visualmente), pero con textos diferentes (bueno, supongo que no son del todo idénticas), ¿pueden ambas tener el mismo identificador? ¿O deberían tener otros diferentes? ¿O en qué situación se supone que debes usar identificadores diferentes?

¿Alguien puede aclarar o vincular a un lugar donde está?

Respuesta

65

Ok, esto es cómo creo que funciona:

Usando dequeueReusableCellWithIdentifier para la tableView, puede acelerar enormemente las cosas. En lugar de crear instancias de muchas celdas, solo crea una instancia de todas las que sean necesarias, es decir, tantas como sean visibles (esto se maneja automáticamente). Si se desplaza a un área de la lista donde hay "celdas" que aún no tienen su representación visual, en lugar de crear instancias nuevas, reutilice las ya existentes.

Puede ensayar lo siguiente al hacer esto:

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    NSLog(@"new one"); 
} 
else 
{ 
    NSLog(@"old one"); 
} 

Recuerde, sólo desea dequeueReusableCellWithIdentifier para volver una célula si es aplicable. Entonces, si una celda va a ser reutilizada, asegúrese de que sea correcta para la situación. Para eso son reuseIdentifiers. Por lo general, solo necesitarás uno. Pero puede haber una lista que use varios tipos diferentes de celdas, y en ese caso, deberá mantenerlas separadas al proporcionar reuseIdentifiers diferentes. De lo contrario, podría terminar obteniendo una celda que trata como otro tipo de celda (por ejemplo, la celda UITableView en lugar de la personalizada que usted quería).

Básicamente, según tengo entendido, use reuseIdentifiers diferentes para diferentes tipos de celdas, donde kind significa clase. Si solo usa celdas estándar, probablemente solo necesite un reuseIdentifier.

Este patrón de diseño se conoce como object pooling.

+14

he estado desarrollando iPhone desde hace mucho tiempo y de tropiezo en esta respuesta aclaró mucho este tema. –

+0

Buena explicación :) – Karun

+0

Objeto que agrupa el término correcto un voto a favor para que – Shajo

10

sólo para añadir cosas a quano es por lo demás muy buen respuesta: (He intentado añadir esto como un comentario, pero era demasiado tiempo!)

Incluso reutilice identificadores pueden omitirse en el desarrollo, aunque esto debe ser hecho en circunstancias muy específicas. Si tiene una vista de tabla de 6-7 celdas, y cada una es diferente, puede encontrar que es preferible crear una nueva celda con cero como identificador.

Tener una celda reutilizable significa que cada vez que se llama a cellForRowAtIndexPath, debe verificar la celda, inicializarla si no hay una celda reutilizable, y fuera del alcance de init debe iterar explícitamente a través de todos los paths de índice posibles y configurar el valores para cada etiqueta que dependen explícitamente del tipo de célula que tenga! Entonces, en una vista de tabla con 10 celdas de dinstinct, tendrá que encargarse de crear la celda if nil, y llenarla según lo que haya creado.

Por lo tanto, en este caso, es preferible en términos de mantenimiento de código inicializar cada celda con nil identificador (ya que no se reutilizará de todos modos) y llenar la información de cada celda apropiadamente sin preocuparse por reutilizarla.