Các lớp mô hình của tôi chủ yếu được thực hiện với các phương thức setter/getter tổng hợp và mọi thứ đều ổn. Tất cả mọi thứ đã được nối độc đáo với giao diện người dùng. Sau đó tôi nhận ra rằng việc thay đổi một thuộc tính sẽ khiến các thuộc tính khác thay đổi (thay đổi type
có thể gây ra các thay đổi trong minA
và maxA
) vì vậy tôi đã viết các phương thức setter/getter theo cách thủ công cho thuộc tính type
. Mã sau:Tại sao tôi có ngoại lệ không bị bắt buộc khi triển khai các phương thức setter/getter KVC của riêng mình
QBElementType
@interface QBElementType : NSObject
@property NSRange minRange;
@property NSRange maxRange;
@end
@implementation QBElementType
@synthesize minRange;
@synthesize maxRange;
@end
QBElement
@interface QBElement : QBElementType{
QBElementType *_type;
}
@property (weak) QBElementType *type;
@property NSUInteger minA;
@property NSUInteger maxA;
@end
@implementation QBElement
@synthesize minA = _minA;
@synthesize maxA = _maxA;
- (QBElementType*)type
{
return _type;
}
- (void)setType:(QBElementType*)newType
{
[self willChangeValueForKey:@"type"];
_type = newType; // no need to bother with retain/release due to ARC.
[self didChangeValueForKey:@"type"];
/* Having the following 4 lines commented out or not changes nothing to the error
if (!NSLocationInRange(_minA, newType.minRange))
self.minA = newType.minRange.location;
if (!NSLocationInRange(_maxA, newType.maxRange))
self.maxA = newType.maxRange.location;
*/
}
@end
HỎI: Kể từ đó, bất cứ khi nào tôi thay đổi loại của một phần tử tôi nhận được một ngoại lệ uncaught:
Không thể cập nhật cho người quan sát < NSTableBinder ...> cho con đường quan trọng "type.minRange" từ < QBElement ...>, rất có thể vì giá trị cho phím "loại" đã được thay đổi mà không một KVO thích hợp thông báo đang được gửi. Kiểm tra sự tuân thủ KVO của lớp QBElement.
Có điều gì hiển nhiên tôi bị thiếu trong số KVO-Compliance không? Tại sao tôi nhận được lỗi này?
Tôi đã thử chạy ứng dụng mà không có 'willChangeValueForKey:' và 'didChange ....' nhưng giao diện người dùng không bao giờ được thông báo về thay đổi! (Lưu ý phụ: minA là một biến riêng của nó, nó có thể không xuất hiện theo cách này bởi vì tôi đã đơn giản hóa mã cho câu hỏi này) –
Trong trường hợp đó, có điều gì khác sai. Bạn thực sự không cần phải gọi 'willChange ...' và 'didChange ...' trong một setter như thế. Đối với 'minA' là một biến riêng của nó, được hiểu, và trong trường hợp đó đề xuất của tôi sẽ không hoạt động. Tuy nhiên, có lẽ bạn nên đăng mã đầy đủ, trong trường hợp đơn giản hóa của bạn thay đổi hoặc xóa sự cố. –