Re: what do I need the NSArrayController for?
Re: what do I need the NSArrayController for?
- Subject: Re: what do I need the NSArrayController for?
- From: Roland King <email@hidden>
- Date: Thu, 03 Apr 2014 07:34:49 +0800
On 3 Apr, 2014, at 12:22 am, Seth Willits <email@hidden> wrote:
> On Apr 2, 2014, at 6:54 AM, Roland King <email@hidden> wrote:
>
>> At this point I realized the NSArrayController was doing nothing. ... I took it out and bound direct to the equivalent properties on the model....
>
> It's not doing nothing.
>
> The NSArrayController doesn't simply "forward" objects from the model to the tableview, it has its own copy of the array (the arrangedObjects) which keeps it separate the model.
>
> Normally your controller object would have its own copy of the devices array, be the delegate and data source for the tableview, providing the filtered and sorted data to the tableview, handle the selection notifications and update things. Not to mention listen to when the source devices array changes to get a new copy of it.
>
> NSArrayController does all of that for you, without interfering with your model.
>
> By binding the table view to the model properties directly, you've now established that no other tableview or any other object can have its own selection, or order for those objects. You can't sort or filter the tableview without sorting or filtering the model data itself, which is most often a bad idea.
>
> As for the selection property on your model, you can easily listen to either the tableview or the array controller's selection changing, and set the property yourself. You're not required or expected to binding everything just because you can in some manner.
>
Thanks for the replies thus far - they are making the picture a little clearer. The point about only one tableview being able to have a selection or ordering on the elements is very good, because it's not a use-case I had, I didn't think about it, now I'm wondering how to split the 'list of serial devices' from the 'selected serial device' in a way which works to see if I can (the complication here comes from the act of being selected opening the device and doing stuff and being deselected closes it again, so I need to think on that a bit, perhaps KVO there is better than bindings)
I went back to the venerable Cocoa Bindings programming guide and I can see where one of my expectations came from. In the 'Real World Example' under 'What are Cocoa Bindings' is an example of an array of Combatants, bound to a table view, and another table view showing the weapons for that combatant, one of which is selected. That shows various things being bound to 'selection.*', for instance Title is bound to selection.name. That sent me into the documentation to find that indeed there *is* a selected object property on NSArrayController, but it's a *property* not a binding. So I don't need to bind the 'selection' of the NSObjectArray to something, I need to bind something to the selected *property* of the NSArrayController. The asymmetry and different namespace between properties and bindings bites! Well it's nice to know there is such a property, that's what I needed.
But there's more. That diagram also shows how the selected weapon flows back to the Combatant (thus meaning a combatant can only have one selected weapon :) ). That binds the property selection.selectedWeapon to a binding called .. selectedObject. Where is that binding? I checked the documentation and can find that on pop up buttons and matrices but not on a table view nor an NSArrayController. That example states it's IB-only, no code required, is it just out of date? If it is, is there a way one could use bindings to accomplish what it's doing there, binding the selected object in a detail array directly back to a property on the selected object in the master?
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden