Я использую пользовательские классы для своего стека CoreData.Свойства класса правильно установлены в модели.В приложении есть некоторые моменты, которые абстрагированы от использования setValue ... в NSManagedObject, но у меня есть несколько случаев, когда происходит сбой с NSInvalidArgumentException, особенно при установке связанного объекта;Ошибка указывает на то, что ему нужен определенный тип, и он получает 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 здесь), и это еще одна озадачивающая вещь, но обо всем по порядку.Как я могу принудить объект к типу Contact, какой он на самом деле?
Вот соответствующая трассировка:
* Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина:'Недопустимый тип значения для отношения "один к одному": property = "Contact";желаемый тип = контакт;данный тип = NSManagedObject;value = ...
Для полноты картины класс Address имеет объявление для Contact в виде:
@property (nonatomic, retain) NSManagedObject * Contact;
с реализацией для Contact в виде обычной динамики, например:
@dynamic Contact;
Может быть, мне нужно немного поспать?;-) Спасибо