2013-07-09 12 views
10

Próbuję rozszerzyć NSManagedObject. Używając XCode stworzyłem MyBox.m i MyBox.h (bezpośrednio z pliku xcdatamodel).[NSManagedObject sayHello]: nierozpoznany selektor wysłany do instancji 0x

Potem zmodyfikowano tych plikach:

#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 

i

#import "MyBox.h" 
@implementation MyBox 

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

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

@end 

mogę pobrać wszystkie myBoxes

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

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

ale później zadzwonię

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

kompiluje ale potem dostać

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

Gdybym tylko odczytać wartość jak

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

to działa

znalazłem podobne problemy tutaj, ale żadne rozwiązanie. Dzięki za pomoc.

+8

Prawdopodobnie zapomniałeś ustawić klasę obiektu na 'MyBox' w edytorze coredata. – Alladinian

+1

Ustawiłem Entity-> Name = Entity-> Class = "MyBox" w edytorze coredata. Czy muszę ustawić inne właściwości? – stefanr

+0

Hmm to dziwne. Nie powinno to wystarczyć ... Czy masz kilka wersji? – Alladinian

Odpowiedz

4

Zakładając, że poprawnie ustawiłeś nazwę klasy w jednostce MyBox, domyślam się, że ta aplikacja ma starszą wersję modelu obiektu zarządzanego Głównych danych. Wyczyść swoją kompilację i usuń aplikację na symulatorze/urządzeniu dla dokładnego pomiaru. Aby mieć 100% pewności, usuń również swój katalog danych pochodnych.

Jeśli to nie zadziała, założę się, że nie ustawiłeś poprawnie nazwy klasy jednostki. Wydrukuj swoją NSEntityDescription i upewnij się, że jest to, czego oczekujesz.

19

Właśnie mam ten sam problem. Rozwiązałem go, zmieniając nazwę klasy na nazwę mojej podklasy NSManagedObject w myApp.xcdatamodeld -> configurations -> default -> entities -> myEntity.

+1

Cholera, zawsze o tym zapominam. –

+0

Dzięki! To mnie zabija D: –

+1

Użyłem Xcode 8 Obiektyw c Edytor-> Utwórz NSManagedSubclass iw konfiguracji ma okresy na przedzie wszystkich moich obiektów, które spowodowały ten sam problem, ale zmienianie ich nazw tak, aby pasowało to do autogenerowanego kodu, który je naprawił. –

0

Miałem odpowiednią nazwę klasy ustawioną w xcdatamodeld, ale nie uwzględniłem pliku .m klasy w moim celu. Musiałem kliknąć na .m na lewym pasku bocznym, a następnie zaznaczyć poprawne pole na prawym pasku bocznym w sekcji Członkostwo docelowe.

Powiązane problemy