2013-07-09 17 views
10

Tôi cố gắng mở rộng NSManagedObject. Sử dụng XCode Tôi đã tạo MyBox.m và MyBox.h (trực tiếp từ tệp xcdatamodel).[NSManagedObject sayHello]: bộ chọn không được nhận dạng được gửi tới ví dụ 0x

Sau đó, tôi sửa đổi những tập tin này:

#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 

#import "MyBox.h" 
@implementation MyBox 

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

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

@end 

Tôi có thể lấy tất cả myBoxes

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

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

nhưng sau đó tôi gọi

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

nó biên dịch nhưng sau đó tôi nhận được

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

Nếu tôi chỉ đọc một giá trị như

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

nó hoạt động

tôi thấy vấn đề tương tự ở đây, nhưng không có giải pháp. Cảm ơn sự giúp đỡ của bạn.

+8

Có thể bạn đã quên đặt lớp của thực thể thành 'MyBox' tại trình chỉnh sửa coredata. – Alladinian

+1

Tôi đã thiết lập Entity-> Name = Entity-> Class = "MyBox" trong trình soạn thảo coredata. Tôi có phải đặt một số thuộc tính khác không? – stefanr

+0

Hmm thật kỳ lạ. Không có điều đó là đủ ... Bạn có nhiều phiên bản không? – Alladinian

Trả lời

4

Giả sử bạn đã đặt tên lớp chính xác trên thực thể MyBox, tôi đoán ứng dụng có phiên bản cũ hơn của mô hình đối tượng được quản lý dữ liệu lõi của bạn. Làm sạch bản dựng của bạn và xóa ứng dụng trên trình mô phỏng/thiết bị để có biện pháp tốt. Để chắc chắn 100%, hãy xóa thư mục dữ liệu có nguồn gốc của bạn.

Nếu nó không hoạt động sau đó, tôi sẽ đặt cược rằng bạn chưa đặt tên lớp thực thể một cách chính xác. In ra NSEntityDescription của bạn và chắc chắn rằng đó là những gì bạn mong đợi.

19

Tôi vừa gặp sự cố tương tự. Giải quyết nó bằng cách thay đổi tên lớp thành tên của lớp con NSManagedObject của tôi trong myApp.xcdatamodeld -> configurations -> default -> entities -> myEntity.

+1

Chết tiệt, tôi luôn quên điều này. –

+0

Cảm ơn! Điều này đã giết chết tôi D: –

+1

Tôi đã sử dụng Xcode 8 mục tiêu c Editor-> Tạo NSManagedSubclass và trong cấu hình nó có thời gian trên mặt trước của tất cả các thực thể của tôi gây ra cùng một vấn đề, nhưng đổi tên chúng để nó khớp với mã autogenerated cố định nó. –

0

Tôi đã đặt tên lớp đúng trong xcdatamodeld, nhưng tôi không đưa tệp .m của lớp vào mục tiêu của mình. Tôi đã phải bấm vào .m trên thanh bên trái, sau đó kiểm tra hộp chính xác ở bên phải bên dưới mục tiêu thành viên.