2012-02-17 13 views
36

Estoy convirtiendo a iOS 5 y guiones gráficos. Cuando tengo una vista de tabla con el estilo de celda predeterminado, todo funciona bien.¿Cómo inicializar una celda de tabla de estilo prototipo personalizada en los storyboards iOS 5?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifierFromStoryboard"]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyIdentifierFromStoryboard"]; 
    } 
    return cell; 
} 

He visto ejemplos donde se elimina el bloque "if (cell == nil)". Sin embargo, si lo saco, mi aplicación se bloquea con el mensaje: "UITableView dataSource debe devolver una celda de tableView: cellForRowAtIndexPath:". Esto no es un problema porque funciona como se muestra arriba.

Mi problema es que quiero usar un estilo personalizado para la celda y, por lo tanto, no puedo usar initWithStyle. ¿Cómo inicializo una celda personalizada que he diseñado en el guión gráfico?

La antigua aplicación anterior a 5 tenía una punta y una clase que usaba algo como esto, pero ahora estoy usando el guión gráfico.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    MyCustomTableCell *cell = (MyCustomTableCell *) [tableView dequeueReusableCellWithIdentifier:@"MyCustomIdentifier"]; 
    if (cell == nil) { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyCustomTableCell" owner:self options:nil]; 
     cell = (MyCustomTableCell *) [nib objectAtIndex:0]; 
    } 
    return cell; 
} 
+0

¿Qué sucede si aún intenta utilizar este Nib como el TableViewCell personalizado? – onmyway133

Respuesta

39

De esta manera

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    return cell; 
} 
+8

Eso da como resultado una celda con el estilo predeterminado y no el estilo personalizado del guión gráfico. –

+3

aquí y ejemplo http://www.techotopia.com/index.php/Using_Xcode_Storyboards_to_Build_Dynamic_TableViews_with_Prototype_Table_View_Cells – Alex

+0

supongo que funciona .. – Alex

0

Creo que éste funciona muy bien. Estuve tratando de entenderlo por algún tiempo y gracias funcionó ... bueno, yo estaba haciendo esto, cuando trataba de asignar una celda que estaba asignando usando la clase de celda general en lugar de la que había creado

así que estaba haciendo esto, así que eso es por lo que no funcionó

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

así que en vez de alloc UITableViewCell la célula con su clase, bien con el ejemplo anterior "CustomCell"

Gracias de nuevo

8

si usted cargar su controlador de vista que co ntains la tableview usando:

MyViewController *myViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; 

A continuación, en el interior cellForRowAtIndexPath que sólo tiene una línea:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifierFromStoryboard"]; 

dequeueReusableCellWithIdentifier creará una instancia de una célula si no existe ninguno.

+4

Esta debería ser la respuesta aceptada hasta donde yo sé. La comprobación de celdas nulas, etc. es una repetición inútil al usar guiones gráficos. – powerj1984

9

Esto funcionó perfecto para mí (Xcode 4.5.2 y iOS 6.0):

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 

    if(cell == nil){ 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; 
    } 

    UILabel *title = (UILabel*) [cell viewWithTag:1000]; 
    UILabel *summary = (UILabel*) [cell viewWithTag:1001]; 
    [title setText:[ tableMainTitle objectAtIndex:indexPath.row]]; 
    [summary setText:[ tableSubTitle objectAtIndex:indexPath.row]]; 
    return cell; 
} 

Importante: No se olvide de establecer delegado y fuente de datos.

+4

Para iOS6 con guiones gráficos, la celda nunca es nula después de la eliminación. – mskw

+1

@mskw entonces una celda siempre será válida y utilizable? o tienen algún otro método para identificar celdas inválidas (como una constante o algo así) – twinlakes

+1

Dado que tiene el identificador correcto, sí. De lo contrario, se romperá quejándose de eso. – mskw

0
static NSString *[email protected]"SearchUser"; 
SearchUserCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier]; 
if (cell==nil) 
{ 
    cell=[[SearchUserCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; 
} 
return cell; 
+1

Entonces, ¿qué significa ese código? Algunos comentarios habrían ayudado. –

Cuestiones relacionadas