2012-02-05 8 views
18

Me gustaría crear una UITableViewCell personalizada utilizando un XIB, pero no estoy seguro de cómo reciclarla utilizando el mecanismo de puesta en cola de UITableViewController. ¿Cómo puedo lograr esto?¿Cómo puedo reciclar objetos UITableViewCell creados desde un XIB?

Amigos, esta pregunta estaba destinada a ser auto-respondida como por the FAQ, aunque me encantan las respuestas impresionantes. Tenga algunos upvotes, disfrute de una cerveza. Le pregunté esto porque un amigo me preguntó y quería subirlo a StackOverflow. Si tienes algo para contribuir, ¡por supuesto!

Respuesta

51

Si utilizas iOS 5 puede utilizar

[self.tableView registerNib:[UINib nibWithNibName:@"nibname" 
              bundle:nil] 
    forCellReuseIdentifier:@"cellIdentifier"]; 

Entonces cada vez que llame:

cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"]; 

la tableview va a cargar ya sea la punta y le dará una célula, o quitar de la cola de una célula ¡para ti!

¡El plumín solo necesita ser una punta con una sola tabla vista definida en su interior!

+3

No sabía nada de esto. – Moshe

+2

¡Era una nueva API que se introdujo con iOS5, la estaba usando desde el día en que la vi, hace que la vida sea tan simple! Incluso puede llegar a ser más avanzado subclasificando UITableViewCell y agregando propiedades IBOutlet que apuntan a los diversos controles en la celda, ¡por lo que ya no necesita usar ViewWithTag! –

+0

¡Absolutamente increíble! – Moshe

2

Crea un plumón vacío y agrega la celda de la tabla como primer elemento. En el inspector, puede agregar la cadena reuseIdentifier en Interface Builder.

Para usar el celular en su código, haga lo siguiente:

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *reuseIdentifier = @"blah"; //should match what you've set in Interface Builder 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"YourTableCellNib" owner:nil options:nil] objectAtIndex:0]; 
    } 

    //set up cell 

    return cell; 
} 

hay otro método que se puede crear una salida para su celular y cargar la punta celular utilizando el controlador como el propietario del archivo, pero sinceramente este es mucho mas facil

Si desea poder acceder a las subvistas que ha agregado a la celda en el plumín, proporcione etiquetas únicas y acceda a ellas con [cell viewWithTag: x];

Si desea poder establecer propiedades personalizadas en la celda, deberá crear una subclase UITableViewCell personalizada, luego simplemente establecerla como la clase de su plumín en InterfaceBuilder y convertir UITableViewCell en su subclase personalizada cuando lo dequeue en el código de arriba.

1

aquí cómo se puede hacer:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    YourCustomeCell *cell = (YourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName]; 
    if (!cell) 
    { 
    NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil]; 
    cell = [topLevelItems objectAtIndex:0]; 
    } 

    return cell; 
} 

Dónde cellLoader en .h se define de la siguiente manera:

UINib *cellLoader; 

y en .m se istantiated de la siguiente manera (por ejemplo, durante la inicialización):

cellLoader = [[UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]] retain]; 

y CellClassName es el definido en .m de la siguiente manera (es als o el nombre de tu xib).

static NSString *CellClassName = @"YourCustomeCell"; 

No se olvide de utilizar la cadena CellClassName también en su xib creado celular.

Para obtener más información, le sugiero que lea este fantástico tutorial creating-a-custom-uitableviewcell-in-ios-4.

Espero que ayude.

P.S. Le sugiero que use UINib porque es un método optimizado para cargar archivos xib.

2

Para configurar una costumbre UITableViewCell utilizando un XI ter, que tiene que hacer varias cosas:

  • Configure una IBOutlet en su cabecera
  • Configurar la célula vista de tabla en el Interface Builder
  • de carga del XI ter interior de tableView:cellForRowAtIndexPath:
  • Configurar como cualquier otra célula

Así que ... vamos a configurar una IBOutlet en el archivo de encabezado.

@property (nonatomic, retain) IBOutlet UITableViewCell *dvarTorahCell; 

No olvides sintetizarlo dentro del archivo de implementación.

@synthesize dvarTorahCell; 

Ahora, vamos a crear y configurar la celda. Usted quiere prestar atención al identificador de celda y la IBOutlet como se muestra a continuación:

enter image description here

Ahora en código, se carga hasta el XI ter en su celda como se muestra aquí:

enter image description here

Observe que el identificador de celda en el generador de interfaz coincide con el que se muestra en el siguiente código.

Luego, siga adelante y configure su celda como cualquier otra.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (cell == nil) { 

    [[NSBundle mainBundle] loadNibNamed:@"YUOnlineCell" owner:self options:nil]; 
    cell = dvarTorahCell; 
    dvarTorahCell = nil; 
} 

//configure your cell here. 

Ten en cuenta que cuando se accede a subvistas, tales como etiquetas, ahora tiene que referirse a ellos por etiqueta, en lugar de por los nombres de propiedades, tales como textLabel y detailTextLabel.

Cuestiones relacionadas