2015-01-01 18 views
5

Tôi có một NSManagedObject. Khi tôi tạo một cá thể, nó không thành công phương thức isKindOfClass.NSManagedObject bị lỗi 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"); 
} 

Output:

False 

tôi đã thêm đoạn mã sau:

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

Và nhìn vào nó trong trình gỡ lỗi này là những gì tôi tìm thấy:

enter image description here

In mô tả của classClass in "DayModel".

Tôi không chắc điều này có liên quan, nhưng DayModel được triển khai trong Swift.


CẬP NHẬT

này là không trong lớp thử nghiệm của tôi, nhưng không phải trong ứng dụng iOS. Vấn đề có vẻ tương tự như this issue. Tuy nhiên, tôi đã thêm tất cả các lớp tôi có thể vào mục tiêu kiểm tra và nó vẫn không thành công.

+1

Không chắc, nhưng điều này có thể giúp ... http://stackoverflow.com/a/12161219/2274694 –

+0

Cảm ơn, Tôi nghĩ điều đó rất gần.Điều này là không trong một lớp thử nghiệm, nhưng làm việc trong ứng dụng. Tôi đã thêm tất cả các lớp học với mục tiêu dù ... – rob

+0

Trong soạn thảo mô hình, tên lớp phải được xxx.DayModel nơi xxx là tên của module ứng dụng của bạn. Đây có phải là trường hợp không? – jrturton

Trả lời

5

Tôi vừa gặp sự cố tương tự.

Các vấn đề trong trường hợp của tôi đã thực sự không phải là tôi đã mất tích tập tin nguồn trong dự án thử nghiệm như bạn đề cập đến trong bản cập nhật của bạn có liên kết: isKindOfClass returning NO unexpectedly

Nguyên nhân sâu xa là do có quá nhiều file nguồn với cùng lớp. Trong mục tiêu thử nghiệm của bạn, bạn có thể có mục tiêu phụ thuộc vào mục tiêu chứa ứng dụng của bạn, tức là bạn đã có sẵn tệp nguồn.

Do đó hãy đảm bảo xóa tệp nguồn chứa lớp bạn đang sử dụng trong isKindOfClass từ 'Nguồn biên dịch' cho mục tiêu thử nghiệm trong tab 'Tạo giai đoạn'.

(Trong trường hợp của bạn loại bỏ DayModel.m)

tôi tìm thấy giải pháp cho vấn đề của tôi ở đây: isKindOfClass and NSStringFromClass disagree about UIApplicationDelegate

Dường như khi có nhiều file nguồn với lớp cùng các isKindOfClass có hành vi kỳ quặc, vì nó không thể thấy hai lớp giống nhau.

+0

Cảm ơn đề xuất @dynamokaj. Tuy nhiên, nếu tôi loại bỏ DayModel khỏi các nguồn biên dịch trong mục tiêu thử nghiệm, tôi nhận được một lỗi biên dịch vì DayModel không còn nhìn thấy được đối với lớp thử nghiệm nữa. – rob

4

Được đập đầu của tôi chống lại điều này trong nhiều giờ, và tất cả những gì tôi có thể tìm thấy trên web là mục tiêu. Hóa ra tôi đã không đặt trường "Lớp" trong trình chỉnh sửa xcdatamodeld, nó vẫn là "NSManagedObject" khi nó phải là tên của lớp ...

Kiểm tra để đảm bảo tên lớp là cả hai trường "Tên" VÀ trường "Lớp" trong Trình theo dõi mô hình dữ liệu (Cmd-Opt-3).

+0

Cảm ơn bạn đã phản hồi này. Điều này giải quyết được vấn đề của tôi. –

0

Đối với đối tượng quản lý là tốt hơn để sử dụng cách này để kiểm tra các lớp:

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

} 
Các vấn đề liên quan