2012-10-29 29 views
6

Tôi có một lớp NSManagedObject mà tôi muốn ghi đè lên một setter nhưng tôi đã nói rằng thực hành tốt là không sửa đổi tệp lớp được tạo tự động và tạo danh mục để thay thế chúng. bởi vì nếu bạn thay đổi mô hình và tạo lại tệp, bạn sẽ mất tất cả các bổ sung của mình).Overriding property setter trong một thể loại lớp

Nếu tôi thực hiện một phương pháp cho setter trong một thể loại, nó chắc chắn chạy phương pháp (thử nghiệm với NSLog), nhưng tôi không biết làm thế nào để gán giá trị tài sản thực tế. Thông thường, tôi muốn tổng hợp các tài sản sử dụng

@synthesize finished = _finished;

để tôi có thể truy cập vào bất động sản trong setter sử dụng _finished, như vậy:

- (void)setFinished:(NSNumber *)finishedValue { 
    _finished = finishedValue; 
    self.end_time = [NSDate date]; 
} 

nhưng nơi có tài sản được xác định trong NSManagedObject điều này dường như không thể.

+0

Tại sao isn ' t nó có thể? – trojanfoe

+0

Bạn gặp lỗi nói rằng bạn không thể tổng hợp trong một danh mục – Dan2552

+0

Điều này không trả lời câu hỏi, nhưng đưa bạn đến nơi bạn đang đi theo một cách khác: http://compileyouidontevenknowyou.blogspot.com/2012/06/adding -properties-to-class-you-dont.html –

Trả lời

6

Bạn có thể làm với subclassing xem doc here

- (void)setName:(NSString *)newName 
{ 
    [self willChangeValueForKey:@"name"]; 
    [self setPrimitiveName:newName]; 
    [self didChangeValueForKey:@"name"]; 
} 
+4

Sử dụng '[self setPrimitiveValue: finished forKey : @ "finished"] xuất hiện để làm việc trong thể loại, đó là những gì tôi đang tìm kiếm, cảm ơn đã dẫn tôi đi đúng hướng – Dan2552

+1

Liên kết tới các tài liệu ở trên bị hỏng. Bất cứ ai có thể sửa chữa nó xin vui lòng? – ishahak

1

Trong danh mục, bạn không thể thêm giá trị thuộc tính, chỉ các phương thức. Vì vậy, bạn sẽ cần phải subClass để thực hiện những gì bạn muốn.

+0

bạn có thể, http://stackoverflow.com/questions/8733104/objective-c-property-instance-variable-in-category – someUser

0

Có một cách dễ dàng để làm như vậy, hãy thử như sau:

Model.h

@interface Model 
@property(nonatomic,copy) NSString * string; 
@end 

mẫu + Override .m

@interface Model() 
{ 
    NSString *_string; 
} 
@end 

@implementation Model (Override) 
- (void)setString:(NSString *)string 
{ 
    return _string = string; 
}  
@end 
Các vấn đề liên quan