2015-01-01 32 views
5

Mam obiekt NSManagedObject. Kiedy tworzę instancję, nieoczekiwanie zawiedzie ona metodę isKindOfClass.Obiekt NSManagedObject kończy się niepowodzeniem to testKindOfClass

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"); 
} 

wyjściowa:

False 

I dodaje następujący kod:

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

I patrząc na to w debugera to co znalazłem:

enter image description here

Drukowanie opisu classClass drukuje "DayModel".

Nie jestem pewien, czy jest to istotne, ale DayModel jest implementowany w Swift.


UPDATE

ten zawodzi w mojej klasie testowej, ale nie w aplikacji na iOS. Problem wydaje się podobny do this issue. Dodałem jednak wszystkie klasy, które mogę, do celu testowego i nadal się nie udaje.

+1

Nie jestem pewien, ale to może pomóc ... http://stackoverflow.com/a/12161219/2274694 –

+0

Dzięki, Myślę, że jest blisko.To się nie udaje w klasie testowej, ale działa w aplikacji. Dodałem wszystkie klasy do celu ... – rob

+0

W edytorze modelu nazwa klasy musi mieć wartość xxx.DayModel, gdzie xxx to nazwa modułu aplikacji. Czy tak jest? – jrturton

Odpowiedz

5

Po prostu miałem ten sam problem.

Problem w moim przypadku było faktycznie nie, że brakuje pliku źródłowego w projekcie badania, jak wspomina w swojej aktualizacji z linkiem: isKindOfClass returning NO unexpectedly

główną przyczyną było spowodowane zbyt wiele plików źródłowych Europejska sama klasa. W twoim celu testowym prawdopodobnie masz docelową zależność od celu zawierającego twoją aplikację, tzn. Masz już plik źródłowy.

Dlatego należy usunąć plik źródłowy zawierający klasę, której używasz w poluKindOfClass ze "Źródeł kompilacji" dla miejsca docelowego testu w zakładce "Kompiluj fazy".

(w przypadku usunięcia DayModel.m)

Znalazłem rozwiązanie mojego problemu tutaj: isKindOfClass and NSStringFromClass disagree about UIApplicationDelegate

Wydaje się, że gdy o wiele plików źródłowych z tej samej klasie isKindOfClass ma dziwne zachowanie, ponieważ nie może zobaczyć dwóch klas jako takich samych.

+0

Dzięki za sugestię @dynamokaj. Jeśli jednak usunę DayModel ze źródeł kompilacji w celu testowym, otrzymam błąd kompilacji, ponieważ DayModel nie jest już widoczny dla klasy testowej. – rob

4

Przez kilka godzin waliłem głową w tę stronę, a wszystko, co mogłem znaleźć w sieci, było rzeczą Celów. Okazuje się, że nie ustawiłem pola "Klasa" w edytorze xcdatamodeld, wciąż było "NSManagedObject", kiedy powinno być nazwą klasy ...

Sprawdź, czy nazwa klasy jest w obu pole "Nazwa" I pole "Klasa" w Inspektorze modelu danych (Cmd-Opt-3).

+0

Dziękuję za tę odpowiedź. To rozwiązało mój problem. –

0

Dla obiektów zarządzanych lepiej jest użyć w ten sposób sprawdzić klasę:

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

} 
Powiązane problemy