views:

412

answers:

1

I'm trying to create a simple interface to my core data model in the style of iTunes Genre browser.

I have a model setup with three entities: Genre <-->> Artist <-->> Album.

I'd like to simply tie them each to a NSTableView, but it appears as though accessing children relationships from a NSArrayController is not KVC compliant. So, I'm having difficulty communicating the selected Genre objects to the ArtistController.

How do you do this? Is it even possible within IB without any custom subclassing?

Edit for Posterity: I was doing several things wrong.

  • The child controller needs to know about the managedObjectContext through its own binding.
  • The child controller must not be in Entity Mode, but rather operate as a NSMutableDictionary class.
  • And, finally, the child controller does not prepare its data. It retrieves it from the parent, through the Content Set binding. Use the controller key selection, and the model key path that connects to the children.

phew. Both Brian's answer and this MacResearch tutorial were helpful in determining my errors (and which parts I had right).

+2  A: 

The approach I would probably take is to have a separate NSArrayController for each table view, then have the content of one array controller be based on the selection of another.

For example, say you have table view A that displays the list of available genres, so it has an array controller A whose content is hooked up to your managed object context.

Then, say you have table view B which shows the available artists for whichever genre is selected in table A. This table would have its own array controller B, and the content array for controller B is bound so the "controller key" field in IB is set to the "selection" key of controller A, with "artists" being the model key (this assumes your Genre entity has a to-many relationship named "artists" to the Artist entity).

You can then apply the same principle to a third table view + controller to show the albums for the selected artist.

The general term for this kind of setup is a "master-detail interface", and is outlined in Apple's docs at this link

Brian Webster
Yes, that's precisely what I tried. I get the runtime error: `[<MBGenre 0x20003c5a0> valueForUndefinedKey:]: the entity MBGenre is not key value coding-compliant for the key "artists".` I've tried about six or seven different ways of accessing the child relationship, none of which work. Thanks for the input; it makes me feel a lot less crazy.
Matt B.