2012-03-06 16 views
5

Estoy usando guiones ios5 con un UITableViewController con una subclase UITableViewCell. No quiero diseñar los elementos visuales de la celda en el diseñador del guión gráfico para la vista, porque quiero usar una subclase reutilizable de UITableViewCell (específicamente TDBadgedCell).dequeueReusableCellWithIdentifier no devuelve la celda de mi tipo personalizado

He establecido el identificador de mi celda en el diseñador del guión gráfico, y todas las filas se cargan correctamente en UITableView, siempre que no establezca ninguna de las propiedades exclusivas de TDBadgedCell. Si configuro la propiedad badgeString, que es exclusiva de TDBadgedCell, recibo una excepción. Reduje que dequeueReusableCellWithIdentifier: no devuelve una celda de tipo TDBadgedCell.

Solo me encuentro con esto con un UITableViewController. Tengo un UIViewController con una UITableView integrada configurada de la misma manera y no es un problema. ¿Algunas ideas?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
static NSString *CellIdentifier = @"PhoneNumberCell"; 
TDBadgedCell *cell = (TDBadgedCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [[TDBadgedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

if ([cell isKindOfClass:[TDBadgedCell class]]) 
{ 
    NSLog(@"It is TDBadgedCell"); 
} 
else 
    NSLog(@"It is NOT TDBadgedCell"); 
+6

¿También cambió la "Clase personalizada" para que sea TDBadgedCell en el diseñador de guiones gráficos? – fengd

+0

posible duplicado de [Prototype Cells en un plumín en lugar de un guión gráfico] (http://stackoverflow.com/questions/8574188/prototype-cells-in-a-nib-instead-of-a-storyboard) - solo posible, No estoy seguro si tienes un xib separado para esta celda o no. – jrturton

+0

1 de junio - ¡Eso fue todo! ¡Gracias! Sin embargo, no estoy seguro de cómo marcar tu respuesta como la respuesta. – scubasteve

Respuesta

0

tuve un problema similar en que estoy de subclases UITableViewCell pero no el uso de guión gráfico. Aquí está mi solución para usar diferentes clases de celda dependiendo de si el usuario compró la función de desbloqueo de la aplicación. Espero que ayude a alguien.

En pocas palabras, tenía la celda con varios objetos, incluido un objeto UITextView. Quería bloquear la función copiar y pegar del objeto UITextView en la versión lite pero luego liberar la característica una vez que el usuario la había comprado en el producto integrado en la aplicación.

Tenía dos clases UITableViewCell, una con UITextView tal como es y otra con UITextView subclasificado con canBecomeFirstresponder que devuelve NO. De esta forma, el usuario podría desplazarse hacia arriba y hacia abajo en los datos de UITextview, pero no copiar y pegar los datos.

Aquí está el código y todo lo que tuve que hacer fue cambiar el nombre de los identificadores de reutilización.

¿POR QUÉ? Porque [self.tableview reloadData] no reconstruiría las celdas con la nueva clase ya que la celda aún existía. Las nuevas celdas de la pantalla obtendrían la nueva clase, pero las existentes no. Esta solución reconstruye todas las celdas una vez apagadas después de la compra, desbloqueando la función agregada.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 


if (your test if in-app was purchased is yes) 
{ 
static NSString *MyIdentifier = @"MyCell"; 

FrontCell *cell = (FrontCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

if (cell == nil) 
     { 
     cell = [[FrontCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.shouldIndentWhileEditing = NO; 
    } 

//....///  

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row]; 
cell.trackDetails.delegate = self; 
cell.trackDetails.tag = indexPath.row; 


return cell; 
} 
else // inapp not purchased 
{ 
    static NSString *MyLockedIdentifier = @"MyLockedCell"; 

    FrontCellLocked *cell = (FrontCellLocked *)[tableView dequeueReusableCellWithIdentifier:MyLockedIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[FrontCellLocked alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyLockedIdentifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.shouldIndentWhileEditing = NO; 
    } 

    //....///  

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row]; 
cell.trackDetails.delegate = self; 
cell.trackDetails.tag = indexPath.row; 


return cell; } 
} 
0

En el guión gráfico, puede establecer la propiedad Clase personalizada para una subclase de UITablviewCell.
Luego el método dequeueReusableCellWithIdentifier devolverá la celda con el tipo de su subclase.

0

Creo que está utilizando un método incorrecto para eliminar las células.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = [self.tblProfileInfo dequeueReusableCellWithIdentifier:@"PostCell" forIndexPath:indexPath]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    return cell; 

} 

Se olvidó de indexPath al final.

+0

Intente cambiar "TDBadgedCell * cell = (TDBadgedCell *) [tableView dequeueReusableCellWithIdentifier: CellIdentifier];" a "TDBadgedCell * cell = (TDBadgedCell *) [tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath];" –

Cuestiones relacionadas