我为我的CoreData堆栈使用自定义类。类属性在模型中正确设置。在应用程序中有一些抽象使用setValue ...在NSManagedObject上,但我有一些情况下,NSInvalidArgumentException失败,特别是在设置相关对象时;错误表示它想要特定的类型,并且它'获取NSManagedObject,因此是错误。所以,我认为如果它是某个实体的话,我会采取短路线并在违规呼叫之前投我的实例;像这样:将NSManagedObject转换为子类型的问题
NSManagedObject *addressObject = [NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:[object managedObjectContext]];
if ([[[object entity]name] isEqualToString:@"Hospital"]) {
Contact *contact = (Contact*)object;
DLog(@"The class of contact is: %@", [contact class]);
contact.Address = addressObject;
}
else{
[object setValue:addressObject forKey:@"Address"];
}
我知道,地址不应该大写;我继承了这个混乱......无论如何,我完全期望联系人对象是一个联系人,但它不是,它是一个NSManagedObject!我在做什么错了演员?我发现的一切都表明这是正确的投射方式,但由于某种原因,这里不适合我。当然,如果addressObject没有抱怨获得一个NSManagedObject而不是一个Contact(对不起,医院从Contact继承),那么这是没有必要的,这是另一个令人困惑的事情,但首先要做的事情。我如何强制对象键入联系人,它确实是?
下面是相关的痕迹:
*终止应用程序由于未捕获的异常“NSInvalidArgumentException”,理由是:“为一对一的关系不可接受类型的值:属性=‘联系’;所需类型=联系人;给定类型= NSManagedObject;值= ...
为了完整起见,地址类有声明联系人为:
@property (nonatomic, retain) NSManagedObject * Contact;
与实施联系为正常的动态,如:
@dynamic Contact;
也许我需要有些睡眠? ;-)谢谢
谢谢丹尼尔。医院扩展了Contact类和实体。所以,如果我无法摆脱这一点,我怎么能得到地址使用NSManagedObject设置它的Contact属性时不抛出InvalidArgExc?我只是假设将管理对象转换为正确的类型可以解决问题,并且是最快的解决方案。再次感谢 – wkhatch 2011-12-30 14:59:56
啊哈!自定义子类没有被添加到目标中......补充它;我不能相信我错过了这一点。我应该知道,因为每当我看到NSManagedObject的子类始终作为NSManagedObject返回的类似问题时,它可能是您没有在模型中设置类属性,或者...您的类不在目标。当这一切;-)感谢丹尼尔 – wkhatch 2011-12-30 15:51:27