2015-01-01 17 views
5

Possiedo un oggetto NSManagedObject. Quando creo un'istanza, fallisce il metodo isKindOfClass in modo imprevisto.NSManagedObject non funziona isKindOfClass test

NSEntityDescription *entity = [NSEntityDescription entityForName:@"DayModel" inManagedObjectContext:context]; 
DayModel *day = [[DayModel alloc] initWithEntity:entity insertIntoManagedObjectContext:context]; 

if ([day isKindOfClass:[DayModel class]]) { 
    NSLog(@"True"); 
} else { 
    NSLog(@"False"); 
} 

uscita:

False 

ho aggiunto il seguente codice:

Class objectClass = [day class]; 
Class classClass = [DayModel class]; 

E guardando nel debugger questo è quello che ho trovato:

enter image description here

Stampa la descrizione di classClass stampe "DayModel".

Non sono sicuro che questo sia rilevante, ma DayModel è implementato in Swift.


UPDATE

Questo sta fallendo nella mia classe di prova, ma non in app iOS. Il problema sembra simile a this issue. Tuttavia, ho aggiunto tutte le classi che posso al target di test e non funziona ancora.

+1

sicuro, ma questo potrebbe aiutare ... http://stackoverflow.com/a/12161219/2274694 –

+0

Grazie, Penso che sia vicino.Questo non funziona in una classe di test, ma funziona nell'app. Ho aggiunto tutte le classi all'obiettivo ... – rob

+0

Nell'editor del modello, il nome della classe deve essere xxx.DayModel dove xxx è il nome del modulo dell'app. È questo il caso? – jrturton

risposta

5

Ho appena avuto lo stesso problema.

Il problema nel mio caso era in realtà non è che mi mancava il file di origine nel progetto di test come si parla nel vostro aggiornamento con il link: isKindOfClass returning NO unexpectedly

La causa principale è dovuta a troppi file di origine con il stessa classe. Nel tuo target di test probabilmente hai una dipendenza target rispetto alla tua destinazione contenente la tua applicazione, cioè hai già incluso il file sorgente.

Quindi assicurarsi di rimuovere il file sorgente contenente la classe che si sta utilizzando in isKindOfClass da 'Compile Sources' per il target di test nella scheda 'Fasi di build'.

(Nel tuo caso rimuovere DayModel.m)

ho trovato la soluzione al mio problema qui: isKindOfClass and NSStringFromClass disagree about UIApplicationDelegate

Sembra che quando si ha più file di origine con la stessa classe della isKindOfClass ha un comportamento strano, dal momento che non può vedere le due classi come stesse.

+0

Grazie per il suggerimento @dynamokaj. Tuttavia, se rimuovo il DayModel dalle origini di compilazione nella destinazione del test, viene visualizzato un errore di compilazione perché DayModel non è più visibile alla classe di test. – rob

4

State sbattendo la testa contro questo per ore, e tutto quello che ho potuto trovare sul web era la cosa degli Obiettivi. Risulta che non avevo impostato il campo "Classe" nell'editor xcdatamodeld, era ancora "NSManagedObject" quando avrebbe dovuto essere il nome della classe ...

Verificare che il nome della classe sia in entrambi il campo "Nome" E il campo "Classe" nell'Inspector modello dati (Cmd-Opt-3).

+0

Grazie per questa risposta. Questo ha risolto il mio problema. –

0

per gli oggetti gestiti è meglio usare questo modo per controllare la classe:

if ([object.entity.name isEqualToString:NSStringFromClass(MyManagedObjectSubclass.class)]) { 

} 
Non