Ich habe dies jetzt erfolgreich implementiert, mit der Zusammensetzung um das NSMutableDictionary. Ich bin überrascht, wie wenig Code es brauchte. Die Klasse, die ich implementiert habe, ist Board, das zur Darstellung des Modells in einem Brettspiel verwendet wird. Jeder kann durch den Aufruf der addObserver Änderungen für Board Staaten abonnieren: Verfahren, wie dies umgesetzt:
- (void)addObserver:(id)observer {
for (id key in grid)
[self addObserver:observer
forKeyPath:[key description]
options:0
context:key];
}
Da Sie nur auf die Tasten mit der KVO Modell abonnieren können, ich betrogen und auf die Beschreibung abonniert des Schlüssels , aber den Schlüssel selbst als Kontext übergeben. In Objekten, die Instanzen meines Board beobachten, implementiere ich -observeValueForKeyPath:ofObject:change:context:
, um die keyPath-Zeichenfolge zu ignorieren und nur den übergebenen Kontext zu verwenden.
Meine einfache Brett Klasse ist nicht KVO-konform für die künstlichen Eigenschaften ich diese Methode create verwenden, so dass ich bestehen 0
in der options
Eigenschaft so die KVO Maschinen werden nicht versuchen, die alten/neuen Werte dieses Schlüssels. Das würde meinen Code sprengen.
Alles, was das Board ändert (in meiner einfachen Klasse gibt es nur eine Methode, die dies der Fall ist) die erforderlichen Meldungen erhöhen die KVO Maschinen zu veranlassen, in Aktion zu springen:
- (void)setPiece:(id)piece atLocation:(Location*)loc {
[self willChangeValueForKey:[loc description]];
[grid setObject:piece forKey:loc];
[self didChangeValueForKey:[loc description]];
}
Voila! Abonnement für ein NSMutableDictionary mit Nicht-Stringschlüsseln!
Danke. Ich denke, Zusammensetzung um ein NSMutableDictionary ist der Weg zu gehen. Ich kann immer noch nicht sehen, wie man das macht, wenn die Schlüssel NSStrings sind, aber ich denke, dass ich damit arbeiten kann. –
@Quinn Taylor: Der Link zu Ihrer benutzerdefinierten Unterklasse scheint tot und ich müsste diesen Code überprüfen. Hast du es noch irgendwo herumhängen? – Cyrille