2013-07-09 3 views
10

Ich versuche, NSManagedObject zu erweitern. Mit XCode habe ich MyBox.m und MyBox.h (direkt aus der xcdatamodel-Datei) erstellt.[NSManagedObject sayHello]: unerkannter Selektor an Instanz 0x gesendet

Dann modifiziert ich diese Dateien:

#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 

und

#import "MyBox.h" 
@implementation MyBox 

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

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

@end 

ich alle myBoxes

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

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

aber später rufen holen kann ich

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

es kompiliert, aber dann bekomme ich

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

Wenn ich

einen Wert wie
NSLog(@"%@", myBox.name); 

es

funktioniert nur lesen

ich hier ähnliche Probleme gefunden, aber keine Lösung. Danke für Ihre Hilfe.

+8

Wahrscheinlich haben Sie vergessen, die Klasse der Entität im Coredateneditor auf 'MyBox' zu setzen. – Alladinian

+1

Ich habe Entity-> Name = Entity-> Class = "MyBox" im Coredata Editor gesetzt. Muss ich einige andere Eigenschaften festlegen? – stefanr

+0

Hmm, das ist seltsam. Nein, das sollte genug sein ... Haben Sie vielleicht mehrere Versionen? – Alladinian

Antwort

4

Angenommen, Sie haben den Klassennamen korrekt auf der Entität MyBox festgelegt, würde ich vermuten, dass die App eine ältere Version Ihres Core Data Managed Object Modells hat. Reinige deinen Build und lösche die App auf dem Simulator/Gerät für eine gute Maßnahme. Um 100% sicher zu sein, löschen Sie auch den abgeleiteten Datenordner.

Wenn es danach nicht funktioniert, wette ich, dass Sie den Namen der Entitätsklasse nicht richtig gesetzt haben. Drucken Sie Ihre NSEntityDescription aus und stellen Sie sicher, dass Sie das erwartet haben.

19

Ich habe gerade das gleiche Problem. Gelöst habe ich es, indem ich den Klassennamen in myApp.xcdatamodeld -> configurations -> default -> entities -> myEntity in den Namen meiner NSManagedObject-Unterklasse änderte.

+1

Verdammt, ich vergesse immer dieses Ding. –

+0

Danke! Das hat mich getötet. D: –

+1

Ich habe Xcode 8 objectiveeditor-> Create NSManagedSubclass und in der Konfiguration hat es Punkte auf der Vorderseite aller meiner Entitäten, die das gleiche Problem verursacht haben, aber umbenennen, so dass es dem automatisch generierten Code entspricht. –

0

Ich hatte den richtigen Klassennamen in xcdatamodeld festgelegt, aber ich habe die .m-Datei der Klasse nicht in mein Ziel aufgenommen. Ich musste auf die .m in der linken Seitenleiste klicken, dann das richtige Feld in der rechten Seitenleiste unter Ziel-Mitgliedschaft aktivieren.

Verwandte Themen