2013-07-09 9 views
10

Cerco di estendere NSManagedObject. Usando XCode ho creato MyBox.m e MyBox.h (direttamente dal file xcdatamodel).[NSManagedObject sayHello]: selettore non riconosciuto inviato all'istanza 0x

Poi ho modificato questi file:

#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 

e

#import "MyBox.h" 
@implementation MyBox 

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

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

@end 

posso recuperare tutti myBoxes

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

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

ma poi io chiamo

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

compila, ma poi ho capito

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

Se leggo solo un valore come

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

funziona

ho trovato problemi simili qui, ma nessuna soluzione. Grazie per il vostro aiuto.

+8

Probabilmente hai dimenticato di impostare la classe dell'entità su 'MyBox' nell'editor Coredata. – Alladinian

+1

Ho impostato Entity-> Name = Entity-> Class = "MyBox" nell'editor di Coredata. Devo impostare alcune altre proprietà? – stefanr

+0

Hmm è strano. No, dovrebbe essere sufficiente ... Hai forse più versioni? – Alladinian

risposta

4

Supponendo di aver impostato correttamente il nome classe sull'entità MyBox, suppongo che l'app abbia una versione precedente del modello di oggetti gestiti di Core Data. Pulisci la tua build ed elimina l'app sul simulatore/dispositivo per buona misura. Per essere sicuro al 100%, elimina anche la cartella dei dati derivati.

Se non funziona dopo, scommetto che non hai impostato correttamente il nome della classe di entità. Stampa il tuo NSEntityDescription e assicurati che sia quello che ti aspetti.

19

Ho appena avuto lo stesso problema. Risolto modificando il nome della classe con il nome della sottoclasse NSManagedObject in myApp.xcdatamodeld -> configurations -> default -> entities -> myEntity.

+1

Dannazione, ho sempre dimenticato questa cosa. –

+0

Grazie! Questo mi stava uccidendo D: –

+1

Ho usato Xcode 8 obiettivo c Editor-> Crea NSManagedSubclass e nella Configurazione ha punti sulla parte anteriore di tutte le mie entità che hanno causato lo stesso problema, ma rinominandole in modo che corrispondesse al codice generato automaticamente. –

0

Ho avuto il giusto nome di classe impostato in xcdatamodeld, ma non ho incluso il file .m della classe nella mia destinazione. Ho dovuto fare clic su .m nella barra laterale di sinistra, quindi selezionare la casella corretta sulla barra laterale destra sotto Appartenenza di destinazione.