Een gedelegeerde instellen voor een NSM-object

Ik heb problemen met het instellen van de gedelegeerde van een Core Data-object voor een bepaalde view-controller die ik heb. Ik krijg en fout waardoor ik geloof dat het de accessor-methoden niet synthetiseert:

2012-06-23 18:21:20.566 App[34164:12803] -[NSManagedObject setSyncDelegate:]:    unrecognized selector sent to instance 0x907cf30
2012-06-23 18:21:20.567 App[34164:12803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject setSyncDelegate:]: unrecognized selector sent to instance 0x907cf30'

Het NSManagedObject, SavedPhoto, heeft de volgende .h:

@interface SavedPhoto : NSManagedObject

@property (nonatomic, strong) NSString *fileName;
@property (nonatomic, strong) id syncDelegate;

@end

en M:

@implementation SavedPhoto

@dynamic fileName;
@synthesize syncDelegate = _syncDelegate;

@end

En ik probeer de gedelegeerde in een view-controller zo in te stellen:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
SavedPhoto *savedPhoto = (SavedPhoto *)[NSEntityDescription insertNewObjectForEntityForName:@"SavedPhoto" inManagedObjectContext:context];
[savedPhoto setSyncDelegate:self];

Waarbij "zelf" een view-controller is die het protocol SyncPhotoDelegate implementeert. Is het zelfs mogelijk om een ​​gesynthetiseerde eigenschap in een NSManagedObject te hebben?

0

1 antwoord

It looks like the instance is not actually one of your class. I would check your model file to make sure it is configured properly. Notice in your console output that it says [NSManagedObject setSyncDelegate:] and not [SavedPhoto setSyncDelegate:]

3
toegevoegd
Is de instantie nu een van uw klas? Ik bedoel, je zou dingen kunnen laten werken voor dingen die de runtime kan converteren naar sleutel-waardecodering, maar het kan de moeite waard zijn om op te sporen. Gieten is niet genoeg tijdens runtime om een ​​goed exemplaar van je klas te krijgen; het staat gewoon code toe om te compileren die de interface van die klasse spreekt, als dat logisch is. U kunt configureren in welke klasse een entiteit wordt geretourneerd zoals in de modeleditor van Xcode in het rechterdeelvenster.
toegevoegd de auteur Chris Trahey, de bron
Ja, Apple heeft behoorlijk goed werk geleverd met het converteren van een lot van dit spul tijdens runtime met sleutel/waardecodering, dus we zien niet altijd precies waarom iets werkt. Voelt zich altijd beter om de typen te hebben die u verwacht!
toegevoegd de auteur Chris Trahey, de bron
Dat is een interessante observatie. Ik heb wel een expliciete cast van SavedPhoto voorafgaand aan SavedPhoto * savedPhoto = (SavedPhoto *) [NSEntityDescription insertNewObjectForEntityForName: @ "SavedPhoto" inManagedObjectContext: context]; Ook heb ik getest [savedPhoto setFileName: @ "foo"] en dat leek te werken, dus sommige van de accessormethoden zijn correct ingesteld.
toegevoegd de auteur Christian, de bron
Bedankt, het probleem was dat "syncDelegate" in feite een tijdelijk kenmerk is. Als zodanig moest ik het niet alleen opnemen in het klassenbestand SavedPhoto, maar ook in het gegevensmodel (.xcdatamodeld) door het kenmerk "syncDelegate" toe te voegen als een ongedefinieerd, tijdelijk kenmerk.
toegevoegd de auteur Christian, de bron
Eigenlijk was het nog steeds van NSManagedObject, maar het werkte nog steeds, zelfs tijdens runtime. Met uw opmerking echter, stel ik het correct in als een instantie van SavedPhoto, dus ik denk dat mijn code nog correcter is en toekomstige fouten voorkomt. Bedankt!
toegevoegd de auteur Christian, de bron