2012-03-15 9 views
8

He visto casi todas las preguntas relacionadas sobre esto aquí en stackoverflow y he intentado con todas sus posibles soluciones, pero todavía no puedo entender por qué obtengo este error:Subclase UITableViewCell personalizada: esta clase no es un valor clave que cumple con la codificación

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<CustomCell 0x6e627d0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key title.' 

estoy tratando de cargar una célula vista de tabla personalizada con el nibname: @ "CustomCell". Su clase está asignada a "CustomCell" (el mismo nombre de clase que el nombre de punta). El propietario del archivo también está configurado para la clase que carga estas celdas: "ProductsTableViewControllerWithSearch". Todos los puntos de venta en la punta están conectadas a las de CustomCell.m

Aquí está mi código:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellClassName = @"CustomCell"; 
    static NSString *CellIdentifier = @"Custom Items Cell"; 

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 

     NSArray *topLevelItems = [[UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]] instantiateWithOwner:self options:nil]; 
     cell = [topLevelItems objectAtIndex:0]; 

    } 
//... more irrelevant code here 
} 

Puede alguien me ayude por favor. He estado trabajando en esto por más de 4 horas. ¡Muchas gracias!

PS: Estoy usando ARC y estoy desarrollando para iOS 5.

Aquí está mi CustomCell.h.

#import <UIKit/UIKit.h> 

@interface CustomCell : UITableViewCell{ 
    UILabel *textLabel; 
    UILabel *detailTextLabel; 
    UIButton *starButton; 
} 

@property (strong, nonatomic) IBOutlet UILabel *textLabel; 
@property (strong, nonatomic) IBOutlet UILabel *detailTextLabel; 
@property (strong, nonatomic) IBOutlet UIButton *starButton; 

@end 

No hay nada en mi CustomCell.m

+0

Lo que es una subclase de CustomCell? – JoePasq

+0

@JoePasq UITableViewCell. – acecapades

Respuesta

10

En Interface Builder es necesario establecer la clase de la célula para CustomCell y CustomCell necesita tener una propiedad title.

this class is not key value coding-compliant for the key …

por lo general significa que una propiedad no se encuentra en una clase y el Interface Builder está tratando de usar esa propiedad, lo que resulta en un accidente.

+0

Sí, ya configuré la clase CustomCell.xib en CustomCell ...Es por eso que pude conectar todos los UILabels en CustomCell.m. – acecapades

+0

¿por qué necesita tener un "título" de propiedad? – acecapades

+1

... No sé. Hmm. En el caso de las vistas "mayores", normalmente todos tienen un título, no sé cuándo/dónde las celdas de la vista de tabla usan su título. – JoePasq

5

Supongo que obtendrá este error cuando su célula se carga desde el NIB en tiempo de ejecución. (Si por el contrario se rompe en alguna línea de código tienes por escrito, por el amor de Dios borrar esa línea de código!)

Ir a la vista XI ter de su celda personalizado, Ctrl + clic en "propietario del archivo" y desvincular lo conexión que tienes allí llamada 'título'. Si te sientes valiente, desenlaza todo y vuelve a vincular lo que quieras. Ve si eso lo aclara. Si no, estaré aquí por unas horas.

+1

Buena estrategia: compruebe si la propiedad 'título' * está * cableada. – JoePasq

+0

¡Esto es casi siempre la causa en este escenario! – lnafziger

+0

Sí, la célula se carga desde el tiempo de ejecución NIB. Está funcionando ahora cuando declaré una propiedad llamada 'título' en el archivo de encabezado. No sabía que una propiedad llamada título tiene que ser declarada. Gracias @JoePasq. No vi eso en todas las otras preguntas relacionadas con esta aquí en StackOverflow. – acecapades

13

Este error se produce si está vinculando algo que no pertenece a esa vista.

En este caso, la solución está en el Interface Builder

  1. Primer Cambio de propietario del archivo identidad de clase a NSObject.
  2. Desvincular cada IBOutlet en el propietario del archivo.
  3. Cambie la clase de identidad de sus NIB personalizados al nombre de la clase CustomTableViewCell.
  4. Enlace todos sus IBOutlet aquí.

Eso es todo.

+0

Si está cargando el plumín directamente en su código ViewController y desea poder escribir el siguiente código. 'Celda MyCustomCell *; cell.customTextField.text.delegate = self; 'Esto funcionará para usted. También creo que tiene más sentido que las otras respuestas actuales. –

+7

Los UILabels de su CustomTablecell deben estar conectados al objeto UITableViewCell, no al propietario del archivo. Me olvido de esto cada vez. No estoy seguro por qué. – user798719

+0

Esta debería ser la respuesta aceptada aquí, al menos resolvió el problema que tenía. – Gereon

0

Por mi caso de XCode6.0.1, yo limpio el proyecto y todo funciona sin problemas

Cuestiones relacionadas