Tôi đã triển khai thành công việc này ngay bây giờ, bằng cách sử dụng bố cục xung quanh NSMutableDictionary. Tôi rất ngạc nhiên khi thấy mã nhỏ như thế nào. Lớp tôi thực hiện là Board, được sử dụng để đại diện cho mô hình trong một trò chơi hội đồng quản trị. Bất cứ ai cũng có thể đăng ký thay đổi cho các quốc gia hội đồng quản trị bằng cách gọi addObserver: phương pháp, thực hiện như thế này:
- (void)addObserver:(id)observer {
for (id key in grid)
[self addObserver:observer
forKeyPath:[key description]
options:0
context:key];
}
Vì bạn chỉ có thể đăng ký các phím sử dụng mô hình KVO, tôi đã lừa dối và đăng ký với mô tả của khóa , nhưng đi qua chính nó như là bối cảnh. Trong các đối tượng quan sát các phiên bản của Bảng của tôi, tôi triển khai -observeValueForKeyPath:ofObject:change:context:
để bỏ qua chuỗi keyPath và chỉ sử dụng ngữ cảnh được truyền vào.
Lớp Ban đơn giản của tôi không tuân thủ KVO đối với thuộc tính nhân tạo mà tôi tạo bằng phương pháp này, vì vậy tôi đã thông qua 0
trong thuộc tính options
để máy móc KVO không cố gắng lấy giá trị cũ/mới của các khóa đó. Điều đó sẽ làm cho mã của tôi nổ tung.
Bất cứ điều gì làm thay đổi hội đồng quản trị (trong lớp học đơn giản của tôi chỉ có một phương pháp mà thực hiện điều này) nâng cao thông báo cần thiết để làm cho máy móc KVO nhảy vào hành động:
- (void)setPiece:(id)piece atLocation:(Location*)loc {
[self willChangeValueForKey:[loc description]];
[grid setObject:piece forKey:loc];
[self didChangeValueForKey:[loc description]];
}
Voila! Đăng ký một NSMutableDictionary với các phím không phải chuỗi!
Nguồn
2009-07-10 19:49:43
Cảm ơn. Tôi nghĩ rằng thành phần xung quanh một NSMutableDictionary là con đường để đi. Tôi vẫn không thể nhìn thấy làm thế nào để làm cho công việc đó, trừ khi các phím là NSStrings, nhưng tôi nghĩ rằng tôi có thể có thể làm việc với điều đó. –
@Quinn Taylor: liên kết tới lớp con tùy chỉnh của bạn có vẻ đã chết và tôi cần phải kiểm tra mã này. Bạn vẫn có nó treo xung quanh một nơi nào đó? – Cyrille