2009-07-20 4 views
7

estoy recibiendo el error anterior cuando las siguientes carreras en el simulador de iPhone (3.0 OS):Error de Objective-C: la propiedad 'activa' es un tipo escalar en la clase 'Rutina'. No se puede generar un método getter para ello

@interface Routine : NSManagedObject { 

} 

@property (nonatomic) BOOL active; 

@implementation Routine 
@dynamic active 
@end 

Como se puede ver, soy la subclasificación NSManagedObject porque soy utilizando datos básicos. En mi modelo de datos, "activo" es un atributo de opción de tipo Booleano.

¿Qué estoy haciendo mal aquí?

Gracias!

Respuesta

17

Todo lo que sale de un CD es un objeto, no un escalador. Así, el cambiador de su código para:

@interface Routine : NSManagedObject { 

} 

@property (nonatomic) NSNumber * active; 

@implementation Routine 
@dynamic active 
@end 

Si se desea se puede añadir un descriptor de acceso conveniencia de tratar con él como un escalar:

- (BOOL) activeScalar { 
    return self.active.boolValue; 
} 

- (void) setActiveScalar:(BOOL)active_ { 
    self.active = [NSNumber numberWithBool:active_]; 
} 

Por último, si controlas clic en una propiedad en el El editor de modelos mostrará un enorme menú contextual, que incluye opciones para copiar las declaraciones y definiciones apropiadas en su tablero de pasta, para que no tenga que escribirlas usted mismo.

+0

Impresionante, eso funcionó. ¡Gracias! – higginbotham

+0

Pequeño error: Cambiar a: - (void) setActiveScalar: (BOOL) active_ { self.active = [NSNumber numberWithBool: active_]; } – benvolioT

2

Por lo que vale, encontré que los documentos proporcionan una solución ligeramente diferente a los escalares. En general, no se recomienda utilizar escalares en lugar de objetos, pero si lo hace, http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html explica cómo hacerlo. Utiliza "primitiveName" y "setPrimitiveName" para acceder a los accesores generados automáticamente que ponen su escalar en un objeto (por ejemplo, NSNumber). A continuación, cree una propiedad @ escalar y escriba descriptores de acceso para su propiedad que usen las primitivas.

Esto parece costoso porque bajo el capó CoreData almacena su atributo como un escalar en el almacén permanente y lo convierte en un objeto para exponerlo como primitivo. Por lo tanto, cuando implemente setName, cuando leo los documentos y el código de muestra, su valor se coloca en un objeto y luego el escalar se extrae nuevamente en la implementación automática setPrimitiveName. Parece una reorganización innecesaria de ida y vuelta para cada obtención o conjunto.

Cuestiones relacionadas