Estoy utilizando los Datos principales de programación (es decir, no utilizando .xcdatamodel modelo de datos de archivos) de la misma manera como se muestra en la Apple Datos Básicos De La Utilidad De Tutorial. Así que mi problema es que cuando intento agregar un atributo a una entidad con el tipo de NSBooleanAttributeType, se pone un poco buggy. Cuando lo añado a mi NSManagedObject subclase archivo de encabezado (en el tutorial, que sería Run.h) como

@property (retain) BOOL *booleanProperty;

la compilación falla, diciendo error: property 'booleanProperty' with 'retain' attribute must be of object type.

Parece que en algunos lugares de Cacao uso NSNumber objetos para representar los valores booleanos, así que traté de establecer para

@property (retain) NSNumber *booleanProperty;

lugar. Sin embargo, esto evoca los siguientes errores de tiempo de ejecución:

*** -[NSAttributeDescription _setManagedObjectModel:]: unrecognized selector sent to instance 0x101b470
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSAttributeDescription _setManagedObjectModel:]: unrecognized selector sent to instance 0x101b470'

Usando GDB, soy capaz de hacer el seguimiento de esta vuelta a la línea en el código fuente donde puedo agregar mi entidad en el modelo de objetos administrados:

[DVManagedObjectModel setEntities:[NSArray arrayWithObjects:myEntityWithABooleanAttribute, myOtherEntity]];

Así que mi pregunta es esta: ¿qué tipo debería establecer booleanProperty en mi clase personalizada de cabecera?

OriginalEl autor Michael Victor Zink | 2009-06-20

8 Comentarios

  1. 18

    Tratar:

    @property (nonatomic) BOOL booleanProperty;

    El problema fue que utilizó el retener en la definición de la propiedad. Para que usted debe tener una propiedad de una clase Objective-C (debe ser capaz de entender el ‘retener’ método). BOOL no es una clase sino un alias para signed char.

    También vale la pena señalar que es «BOOL booleanProperty», con no. * El * es solo para los punteros, incluyendo punteros de objeto.
    Consulte esta respuesta para una más adecuada solución.
    Esta respuesta debería ser eliminado, ya que es incorrecto.

    OriginalEl autor diederikh

  2. 18

    Yo no recomendaría el método sugerido por Diederik Hoogenboom (tengo un error, aunque mis principales datos de atributo se establece como Boolean).

    Vale la pena señalar que aunque esta línea de trabajo para un objeto personalizado, no va a funcionar para una subclase de NSManagedObject:

    @property (nonatomic) BOOL booleanProperty;

    Su propiedad debe establecerse como este:

    @property (nonatomic, retain) NSNumber *booleanProperty;

    Cuando copio el método de las declaraciones de un tipo Booleano (utilizando la técnica sugerida por Jim Correia), los getter y setter se escribe como:

    NSNumber:-(NSNumber *)booleanProperty; 
    -(void)setBooleanProperty:(NSNumber *)value;

    …esto es lo que una propiedad Booleana en los datos de los núcleos se establece como y que necesitas para validar su propiedad con algo como esto:

    -(BOOL)validateBooleanProperty:(NSNumber **)toValidate error:(NSError **)outError 
    {
        int toVal = [*toValidate intValue];
    
        if ( (toVal < 0) || (toVal > 1) )
        {
            NSString *errorString = NSLocalizedStringFromTable(@"Boolean Property", @"TheObject", @"validation: not YES or NO");
            NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorString forKey:NSLocalizedDescriptionKey];
    
            NSError *error = [[[NSError alloc] initWithDomain:NSCocoaErrorDomain code:-1 userInfo:userInfoDict] autorelease];
            *outError = error;
            return NO;
        }
        return YES;
    }//END

    …recuerde incluir el validateBooleanProperty declaración en el archivo de encabezado. El setter y getter métodos para almacenar y recuperar su propiedad mediante -(id)primitiveValueForKey:(NSString *).

    Finalmente, usted necesita llamar explícitamente al método validate desde cualquier controlador de vista /app delegado está configurando el objeto de:

        NSNumber *boolProp = [[[NSNumber alloc] initWithInt :0] autorelease];
        NSError *valError = nil;        
        if ([TheObject validateBooleanProperty:&boolProp error:&valError] == YES)
        {
            [TheObject setBooleanProperty :boolProp];   
        }       

    OriginalEl autor PostCodeism

  3. 15

    En el encabezado,

    @property (nonatomic, retain) NSNumber *booleanProperty;

    En la aplicación,

    @dynamic booleanProperty;

    Para establecer a true…

    self.booleanProperty = [NSNumber numberWithBool:YES];

    Establecer a false…

    self.booleanProperty = [NSNumber numberWithBool:NO];

    A comparar a un literal booleano true:…

    self.booleanProperty.boolValue == YES;

    A comparar a un literal booleano false:…

    self.booleanProperty.boolValue == NO;

    Para obtener más información: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsnumber_Class/Reference/Reference.html#//apple_ref/occ/clm/NSNumber/numberWithBool:

    O utilizar la abreviatura para la asignación, auto.booleanProperty = @(NO);
    Exactamente lo que yo necesitaba. Gracias por ir la milla extra. (Y)

    OriginalEl autor adamek

  4. 6

    Una de las mejores maneras de generar correcta descriptores de acceso en su NSManagedObject subclase es para que aparezca el menú contextual sobre un atributo o propiedad en el modelado de datos de la herramienta y elegir uno de los siguientes comandos:

    • El Método de copia de las Declaraciones al Portapapeles
    • El Método de copia de Implementaciones en el Portapapeles
    • Copia Obj-C 2.0 Método Declaraciones al Portapapeles
    • Copia Obj-C 2.0 Implementaciones de Método al Portapapeles

    OriginalEl autor Jim Correia

  5. 4

    Vamos a Xcode 4.0 decidir por usted.
    En Xcode: seleccione una Entidad de su *.archivo xcdatamodel vista.

    Seleccione Editor>Crear NSMagedObject Subclase…
    Xcode declara su Booleano objetos como tipo NSNumber.

    Edit: tengo la curiosidad de cuál es la motivación para la mitigación de los xcdatamodel? Nadie?

    OriginalEl autor doc taco

  6. 3

    Un atributo de tipo Boolean en un NSManagedObject es de tipo NSCFBoolean. Este es un subclase de NSNumber.

    OriginalEl autor

  7. 2

    No sé si esto es sólo un error por tu parte, pero de esto:

    [NSArray arrayWithObjects:myEntityWithABooleanAttribute, myOtherEntity]

    está definitivamente mal. El último parámetro de ese método siempre debe ser nulo.

    Gracias por decírmelo! Que fue un error tipográfico, aunque.

    OriginalEl autor

Dejar respuesta

Please enter your comment!
Please enter your name here