Key Value Observing with an NSArray

13,609

You don't need an NSArrayController to observe changes to an NSArray. However you cannot directly observe these changes, i.e., you can't call -addObserver:forKeyPath:options:context: directly on an NSArray. In your case you want to call it on your GameModel with @"playerNameArray" as the key.

You're not done yet though. The normal automatic KVO notifications will only kick in if you call -setPlayerNameArray:, thereby replacing the entire array. If you want more granular notifications, then you need to use -willChange:valuesAtIndexes:forKey: and -didChange:valuesAtIndexes:forKey: whenever you insert, remove, or replace items in that array.

This will send a notification whenever the contents of the array changes. Depending on the NSKeyValueObservingOptions you use when adding your observer, you can also get the incremental changes that are made—a cool feature, but you may not need it in this case.

Note: NSArrayController does not exist on iOS. It's part of Cocoa Bindings, which currently only exists in AppKit on Mac OS X. Luckily, you don't need it.

Share:
13,609
cannyboy
Author by

cannyboy

Updated on June 06, 2022

Comments

  • cannyboy
    cannyboy about 2 years

    I've looked on SO for examples of using Key Value Observing with an NSArray (or NSMutableArray) and apparently you need to use an NSArrayController (which unlike KVO I'm not familiar with), but I haven't found concrete examples of how to do this. Can anyone explain with some sample code?

    For instance, if I have a GameModel which represents its player names with an NSArray (playerNameArray) of NSStrings. I want to observe those strings (the view controller observes the model's data) to update various things in the view.

    How do I get notification that the player name array has changed?

    EDIT: Does the iOS SDK even support NSArrayController? If not, is there another way?

  • Adam
    Adam over 12 years
    I tried precisely this setup on iOS-4, and nothing happened (both callbacks implemented, via Xcode autocomplete, so I'm sure they're typed correctly. I checked all objects involved are non-null, everything checked again with breakpoints). Has Apple removed it?
  • Morgan Harris
    Morgan Harris about 12 years
    They're not callbacks - you have to call them in order to get regular KVO on a collection to work.
  • jpswain
    jpswain over 11 years
    @Adam what he's saying is that you have to write your own accessors for the NSMutableArray and fire the KVO notes yourself.
  • fatuhoku
    fatuhoku almost 10 years
    Yeah that little detail wasn't exactly clear in the 4 paragraph answer above :/