2009-07-20 15 views
7

Tôi nhận được lỗi trên khi chạy sau trong trình giả lập iphone (3.0 OS):Lỗi mục tiêu-C: Thuộc tính 'hoạt động' là một loại vô hướng trên lớp 'Định tuyến'. không thể tạo ra một phương thức getter cho nó

@interface Routine : NSManagedObject { 

} 

@property (nonatomic) BOOL active; 

@implementation Routine 
@dynamic active 
@end 

Như bạn thấy, tôi subclassing NSManagedObject vì tôi bằng cách sử dụng Dữ liệu cốt lõi. Trong mô hình dữ liệu của tôi, "hoạt động" là một thuộc tính tùy chọn của kiểu Boolean.

Tôi đang làm gì sai ở đây?

Cảm ơn!

Trả lời

17

Mọi thứ xuất phát từ đĩa CD là một đối tượng, không phải là một scaler. Vì vậy, đổi mã của bạn để:

@interface Routine : NSManagedObject { 

} 

@property (nonatomic) NSNumber * active; 

@implementation Routine 
@dynamic active 
@end 

Nếu bạn muốn, bạn có thể thêm một accessor tiện để đối phó với nó như là một đại lượng vô hướng:

- (BOOL) activeScalar { 
    return self.active.boolValue; 
} 

- (void) setActiveScalar:(BOOL)active_ { 
    self.active = [NSNumber numberWithBool:active_]; 
} 

Cuối cùng, nếu bạn kiểm soát-click vào một tài sản trong trình soạn thảo mô hình nó sẽ mang đến một trình đơn ngữ cảnh rất lớn, bao gồm các tùy chọn để sao chép các khai báo thích hợp và các định nghĩa vào bảng dán của bạn, do đó bạn không phải tự viết chúng.

+0

Tuyệt vời, điều đó đã hiệu quả. Cảm ơn bạn! – higginbotham

+0

Lỗi nhỏ: Đổi thành: - (void) setActiveScalar: (BOOL) active_ { self.active = [Số NSNumberWithBool: active_]; } – benvolioT

2

Đối với những gì đáng giá, tôi nhận thấy tài liệu cung cấp giải pháp hơi khác với vô hướng. Nói chung, bạn không được khuyến khích sử dụng vô hướng thay vì các đối tượng, nhưng nếu bạn làm như vậy thì http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html giải thích cách thực hiện. Bạn sử dụng "primitiveName" và "setPrimitiveName" để truy cập các trình truy cập được tạo tự động để đặt vô hướng của bạn vào một đối tượng (ví dụ: NSNumber). Sau đó, tạo một @property vô hướng và viết accessors cho thuộc tính của bạn sử dụng các nguyên thủy.

Điều này có vẻ tốn kém trong đó dưới mui xe CoreData đang lưu trữ thuộc tính của bạn dưới dạng vô hướng trong lưu trữ phù hợp và chuyển đổi nó thành đối tượng để hiển thị nó dưới dạng nguyên thủy. Vì vậy, khi bạn triển khai setName, khi tôi đọc tài liệu và mã mẫu, giá trị của bạn được đặt trong một đối tượng và sau đó vô hướng được trích xuất lại trong triển khai tự động setPrimitiveName. Có vẻ như marshaling không cần thiết qua lại cho mỗi nhận được hoặc thiết lập.

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