[NSManagedObject sayHello]: непризнанный селектор, отправленный в экземпляр 0x

Я пытаюсь расширить NSManagedObject. Используя XCode, я создал MyBox.m и MyBox.h(непосредственно из файла xcdatamodel).

Затем я изменил эти файлы:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface MyBox : NSManagedObject

@property (nonatomic, retain) NSDate * endDate;
@property (nonatomic, retain) NSNumber * globalId;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSDate * startDate;

-(NSString *)sayHello;

@end

и

#import "MyBox.h"
@implementation MyBox

@dynamic endDate;
@dynamic globalId;
@dynamic name;
@dynamic startDate;

-(NSString *)sayHello {
    return @"hello";
}  

@end

Я могу получить все myBoxes

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"MyBox" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

NSMutableArray *myBoxes = [context executeFetchRequest:fetchRequest error:&error];

но позже я вызываю

MyBox *myBox = [myBoxes objectAtIndex:indexPath.row];    
    [myBox sayHello];

он компилируется, но затем я получаю

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject sayHello]: unrecognized selector sent to instance 0x8e73fc0'

Если я прочитал только значение, подобное

NSLog(@"%@", myBox.name);

работает

Здесь я нашел похожие проблемы, но никакого решения. Благодарим за помощь.

Ответ 1

У меня только одна проблема. Решил его, изменив имя класса на имя моего подкласса NSManagedObject в myApp.xcdatamodeld -> configurations -> default -> entities -> myEntity.

Ответ 2

Предполагая, что вы правильно задали имя класса в объекте MyBox, я бы предположил, что приложение имеет более старую версию модели объектов, управляемой Core Data. Очистите свою сборку и удалите приложение на тренажере/устройстве для хорошей оценки. Чтобы быть уверенным на 100%, также удалите папку с производными данными.

Если после этого это не сработает, я буду держать пари, что вы не правильно задали имя класса сущности. Распечатайте свой NSEntityDescription и убедитесь, что это то, что вы ожидаете.

Ответ 3

У меня было правильное имя класса, установленное в xcdatamodeld, но я не включил файл .m в класс. Я должен был щелкнуть по .m на левой боковой панели, а затем проверить правильную рамку на правой боковой панели в разделе Target Membership.