iphone objective-c uitableview reuseidentifier

iPhone-¿Qué son reuseIdentifiers(UITableViewCell)?



objective-c (3)

De la documentación oficial:

El identificador de reutilización está asociado con un objeto UITableViewCell que el delegado de la vista de tabla crea con la intención de reutilizarlo como base (por razones de rendimiento) para 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á?


Ok, así es como creo que funciona:

Usando dequeueReusableCellWithIdentifier para tableView, puede acelerar mucho las cosas. En lugar de crear instancias de muchas celdas, solo crea una instancia de tantas como sea necesario, es decir, tantas que 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.

Puedes probar esto tú mismo 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, solo desea dequeueReusableCellWithIdentifier para devolver una celda 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).

Entonces, básicamente, según lo entiendo, 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 agrupación de objetos .


Solo para agregar algunas cosas a la muy buena respuesta de quano: (Intenté agregar esto como un comentario, ¡pero fue demasiado largo!)

Incluso los identificadores de reutilización pueden omitirse en el desarrollo, aunque esto debe hacerse 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 establecer los valores para cada etiqueta ¡Depende explícitamente del tipo de célula que tengas! 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 del código inicializar cada celda con un identificador nulo (ya que no se reutilizará de todos modos) y llenar la información de cada celda de manera adecuada sin preocuparse por su reutilización.