2015-01-01 7 views
5

Ich habe ein NSManagedObject. Wenn ich eine Instanz erstelle, schlägt die isKindOfClass-Methode unerwartet fehl.NSManagedObject schlägt fehl 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"); 
} 

Ausgang:

False 

Ich habe den folgenden Code:

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

Und es im Debugger dieser Suche ist das, was ich gefunden habe:

enter image description here

Die Beschreibung von classClass wird gedruckt "DayModel."

Ich bin mir nicht sicher, ob dies relevant ist, aber DayModel ist in Swift implementiert.


UPDATE

Dies ist in meiner Test-Klasse, aber nicht in dem iOS-App versagt. Das Problem scheint this issue ähnlich zu sein. Ich habe jedoch alle Klassen hinzugefügt, die ich zum Testziel hinzufügen kann und es schlägt immer noch fehl.

+1

Nicht sicher, aber dies könnte helfen ... http://stackoverflow.com/a/12161219/2274694 –

+0

Danke, Ich denke, das ist knapp.Dies schlägt in einer Testklasse fehl, funktioniert aber in der App. Ich habe jedoch alle Klassen zum Ziel hinzugefügt ... – rob

+0

Im Modelleditor muss der Klassenname xxx.DayModel sein, wobei xxx der Name Ihres App-Moduls ist. Ist das der Fall? – jrturton

Antwort

5

Ich hatte gerade das gleiche Problem.

Das Problem in meinem Fall war eigentlich nicht, dass ich in dem Testprojekt die Quelldatei fehlt, wie Sie mit dem Link in Ihrem Update erwähnen: isKindOfClass returning NO unexpectedly

Die Ursache wurde aufgrund zu vielen Quelldateien mit der selbe Klasse. In Ihrem Testziel haben Sie wahrscheinlich eine Zielabhängigkeit zu Ihrem Ziel, das Ihre Anwendung enthält, d. H. Sie haben bereits die Quelldatei eingebunden.

Stellen Sie daher sicher, dass Sie die Quelldatei, die die Klasse enthält, die Sie in isKindOfClass verwenden, aus 'Compile Sources' für das Testziel auf der Registerkarte 'Build Phases' entfernen.

(In Ihrem Fall entfernen DayModel.m)

ich die Lösung für mein Problem hier: isKindOfClass and NSStringFromClass disagree about UIApplicationDelegate

Es scheint, dass, wenn sie mit der gleichen Klasse mehr Quelldateien mit dem isKindOfClass merkwürdigem Verhalten hat, weil es die zwei Klassen nicht als die gleichen sehen kann.

+0

Danke für den Vorschlag @dynamokaj. Wenn ich das DayModel jedoch aus Kompilierquellen im Testziel entferne, erhalte ich einen Kompilierungsfehler, da DayModel für die Testklasse nicht mehr sichtbar ist. – rob

4

Ich habe stundenlang mit dem Kopf gegen diesen geklopft, und alles, was ich im Internet finden konnte, war die Targets-Sache. Es stellte sich heraus, dass ich das "Class" -Feld nicht im xcdatamodeld-Editor festgelegt hatte, es war immer noch "NSManagedObject", wenn es der Name der Klasse hätte sein sollen ...

Überprüfen Sie, ob der Klassenname in beiden ist das Feld "Name" und das Feld "Klasse" im Datenmodell-Inspektor (Cmd-Opt-3).

+0

Vielen Dank für diese Antwort. Das hat mein Problem gelöst. –

0

Für verwaltete Objekte besser auf diese Weise verwenden, um die Klasse zu überprüfen:

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

}