21

je l'ai regardé sur le SO des exemples d'utilisation Valeur clé d'observation avec un NSArray (ou NSMutableArray) et apparemment, vous devez utiliser un NSArrayController (qui, contrairement à KVO je ne suis pas au courant), mais Je n'ai pas trouvé d'exemples concrets de la façon de le faire. Quelqu'un peut-il expliquer avec un exemple de code? Par exemple, si j'ai un GameModel qui représente ses noms de joueur avec NSArray (playerNameArray) de NSStrings. Je veux observer ces chaînes (le contrôleur de vue observe les données du modèle) pour mettre à jour diverses choses dans la vue.Valeur clé d'observation avec un NSArray

Comment puis-je savoir que le tableau des noms de joueurs a changé?

EDIT: Le SDK iOS peut-il même prendre en charge NSArrayController? Sinon, y a-t-il un autre moyen?

Répondre

30

Vous n'avez pas besoin d'un NSArrayController pour observer les modifications apportées à un NSArray. Toutefois, vous ne pouvez pas observer directement ces modifications, c'est-à-dire que vous ne pouvez pas appeler -addObserver:forKeyPath:options:context: directement sur un NSArray. Dans votre cas, vous voulez l'appeler sur votre GameModel avec @"playerNameArray" comme clé.

Vous n'avez pas encore terminé. Les notifications KVO automatiques normales ne seront activées que si vous appelez -setPlayerNameArray:, remplaçant ainsi la totalité de la baie. Si vous souhaitez des notifications plus détaillées, vous devez utiliser -willChange:valuesAtIndexes:forKey: et -didChange:valuesAtIndexes:forKey: chaque fois que vous insérez, supprimez ou remplacez des éléments de cette matrice.

Cela enverra une notification chaque fois que le contenu de la matrice change. En fonction du NSKeyValueObservingOptions que vous utilisez lors de l'ajout de votre observateur, vous pouvez également obtenir les modifications incrémentielles qui sont apportées - une fonctionnalité intéressante, mais vous n'en aurez peut-être pas besoin dans ce cas.

Remarque: NSArrayController n'existe pas sur iOS. Cela fait partie de Cocoa Bindings, qui n'existe actuellement que sous AppKit sous Mac OS X. Heureusement, vous n'en avez pas besoin.

+0

J'ai essayé précisément cette configuration sur iOS-4, et rien ne s'est passé (les deux callbacks implémentés, via Xcode autocomplete, donc je suis sûr qu'ils sont correctement tapés.) J'ai vérifié tous les objets impliqués sont non-nul points d'arrêt). Est-ce qu'Apple l'a supprimé? – Adam

+0

Ils ne sont pas des rappels - vous devez les appeler pour que KVO fonctionne normalement sur une collection. –

+4

@Adam ce qu'il dit, c'est que vous devez écrire vos propres accesseurs pour le NSMutableArray et tirer les notes KVO vous-même. – jpswain