我以编程方式使用Core Data(即不使用.xcdatamodel
数据模型文件),其方式与Apple的Core Data Utility Tutorial中描述的方式大致相同.所以我的问题是,当我尝试向具有该类型的实体添加属性时NSBooleanAttributeType
,它会有点错误.当我将它添加到我的NSManagedObject
子类头文件(在教程中,那将是Run.h
)as
@property (retain) BOOL *booleanProperty;
编译失败,说error: property 'booleanProperty' with 'retain' attribute must be of object type
.
似乎Cocoa中的某些地方使用NSNumber
对象来表示布尔值,所以我尝试将其设置为
@property (retain) NSNumber *booleanProperty;
代替.但是,这会引起以下运行时错误:
*** -[NSAttributeDescription _setManagedObjectModel:]: unrecognized selector sent to instance 0x101b470 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSAttributeDescription _setManagedObjectModel:]: unrecognized selector sent to instance 0x101b470'
使用GDB,我能够将其追溯到我的源代码中的行,在那里我将我的实体添加到托管对象模型:
[DVManagedObjectModel setEntities:[NSArray arrayWithObjects:myEntityWithABooleanAttribute, myOtherEntity]];
所以我的问题是:我应该在自定义类头中将booleanProperty设置为什么类型?
尝试:
@property (nonatomic) BOOL booleanProperty;
问题是您在属性定义中使用了retain.为此,您必须拥有Objective-C类的属性(它应该能够理解'retain'方法).BOOL不是类,而是signed char的别名.
我不建议通过Diederik Hoogenboom建议的方法(我得到了,即使我的核心数据的属性被设置为布尔错误).
值得指出的是,虽然这一行适用于自定义对象,但它不适用于NSManagedObject的子类:
@property (nonatomic) BOOL booleanProperty;
您的财产应设置为:
@property (nonatomic, retain) NSNumber *booleanProperty;
当我复制方法声明为布尔类型(使用由吉姆科雷亚建议的技术),吸气和setter被分类为:
NSNumber:-(NSNumber *)booleanProperty; -(void)setBooleanProperty:(NSNumber *)value;
......这是核心数据的布尔属性设置为,你需要像这样的东西来验证你的财产:
-(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
...记得在头文件中包含validateBooleanProperty声明.setter和getter方法使用 - (id)primitiveValueForKey:(NSString*)键存储和检索属性.
最后,您需要从您设置对象的任何视图控制器/应用程序委托中显式调用validate方法:
NSNumber *boolProp = [[[NSNumber alloc] initWithInt :0] autorelease]; NSError *valError = nil; if ([TheObject validateBooleanProperty:&boolProp error:&valError] == YES) { [TheObject setBooleanProperty :boolProp]; }
在标题中,
@property (nonatomic, retain) NSNumber *booleanProperty;
在实施中,
@dynamic booleanProperty;
将其设置为true ...
self.booleanProperty = [NSNumber numberWithBool:YES];
将其设置为false ...
self.booleanProperty = [NSNumber numberWithBool:NO];
将它与文字真实布尔值进行比较:...
self.booleanProperty.boolValue == YES;
将它与文字假布尔值进行比较:...
self.booleanProperty.boolValue == NO;
有关详细信息,请访问:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsnumber_Class/Reference/Reference.html#//apple_ref/occ/clm/NSNumber/numberWithBool:
在NSManagedObject子类中生成正确访问器的最佳方法之一是在数据建模工具中调出属性或属性的上下文菜单,然后选择以下命令之一:
将方法声明复制到剪贴板
将方法实现复制到剪贴板
将Obj-C 2.0方法声明复制到剪贴板
将Obj-C 2.0方法实现复制到剪贴板