21

Ich habe so sieht für Beispiele für die Verwendung Key Value Beobachtung mit einem NSArray (oder NSMutableArray) und anscheinend benötigen Sie ein NSArrayController verwenden (das im Gegensatz zu KVO ich nicht kenne), aber Konkrete Beispiele dafür habe ich nicht gefunden. Kann mir jemand etwas Beispielcode erklären?Key Value Beobachtung mit einem NSArray

Zum Beispiel, wenn ich einen GameModel habe, der seine Spielernamen mit einem NSArray (playerNameArray) von NSStrings darstellt. Ich möchte diese Zeichenfolgen beobachten (der View-Controller beobachtet die Daten des Modells), um verschiedene Dinge in der Ansicht zu aktualisieren.

Wie erhalte ich eine Benachrichtigung, dass sich das Spielernamen-Array geändert hat?

BEARBEITEN: Unterstützt das iOS SDK sogar NSArrayController? Wenn nicht, gibt es einen anderen Weg?

Antwort

30

Sie benötigen keinen NSArrayController, um Änderungen an einem NSArray zu beobachten. Sie können diese Änderungen jedoch nicht direkt beobachten, d. H. Sie können -addObserver:forKeyPath:options:context: nicht direkt auf NSArray aufrufen. In Ihrem Fall möchten Sie es auf Ihrem GameModel mit @"playerNameArray" als Schlüssel anrufen.

Sie sind noch nicht fertig. Die normalen automatischen KVO-Benachrichtigungen treten nur ein, wenn Sie -setPlayerNameArray: aufrufen und dadurch das gesamte Array ersetzen. Wenn Sie detailliertere Benachrichtigungen wünschen, müssen Sie immer -willChange:valuesAtIndexes:forKey: und -didChange:valuesAtIndexes:forKey: verwenden, wenn Sie Elemente in diesem Array einfügen, entfernen oder ersetzen.

Dies sendet eine Benachrichtigung, wenn sich der Inhalt des Arrays ändert. Abhängig von der NSKeyValueObservingOptions, die Sie beim Hinzufügen Ihres Beobachters verwenden, können Sie auch die vorgenommenen inkrementellen Änderungen abrufen - eine coole Funktion, die Sie in diesem Fall jedoch möglicherweise nicht benötigen.

Hinweis: NSArrayController existiert nicht unter iOS. Es ist Teil von Cocoa Bindings, das derzeit nur in AppKit unter Mac OS X existiert. Zum Glück brauchen Sie es nicht.

+0

Ich habe genau dieses Setup auf iOS-4 versucht, und nichts passierte (beide Callbacks implementiert, über Xcode Autocomplete, so bin ich mir sicher, dass sie korrekt eingegeben werden. Ich überprüfte alle beteiligten Objekte sind nicht null, alles erneut überprüft mit Haltepunkte). Hat Apple es entfernt? – Adam

+0

Sie sind keine Callbacks - Sie müssen sie aufrufen, um reguläre KVOs auf einer Sammlung zu erhalten. –

+4

@Adam, was er sagt ist, dass Sie Ihre eigenen Accessoren für das NSMutableArray schreiben müssen und die KVO-Notizen selbst feuern. – jpswain