I found some sample code that addresses this:

http://shanecrawford.org/2008/37/sorting-a-coredata-backed-nsarraycontroller/



On Aug 7, 2009, at 2:50 PM, Brad Gibbs wrote:

Hi,

I have an NSTableView that displays a set of Activity objects, which are subclasses of NSManagedObject, all of which are managed by a custom NSArrayController. Each Activity has a sortIndex property, which is used to... wait for it... sort the activities.

The array controller adds logic to update the sortIndex as objects are added, removed or re-ordered. It's this last part that's giving me grief. The table supports drag-and-drop. The idea is that when an Activity is dragged up or down in the list, the sortIndex for all of the activities get updated, so that the next time the list of activities is displayed, the activities maintain the order in which they were placed by the user.

The array controller's sort descriptors binding is bound to an array with a single NSSortDescriptor, set to order the objects by sortIndex. I think this is causing some grief. Also, the code that assigns new sortIndexes for each object calls [arrayController arrangedObjects] to get the array controller's objects. From my reading of the documentation, this calls arrangeObjects on the underlying array, which I don't really want to do until all of the Activity objects' sortIndexes have been updated to reflect their new positions in the array.

The objects that are dropped are assigned new sortIndexes based on their new indexes immediately after being dropped into the array. I'm not doing anything with the sortIndexes for the items in the array that haven't been moced until later. In the interim, I believe that calling [arrayController arrangedObjects] is trying to make the NSArrayController arrange its objects based on its sort descriptor (sortIndex), while one or more of the objects in the set share the same sortIndex. This is causing problems.

I'm hoping someone can point me to some sample code that addresses this issue. I've looked at Demo Monkey and a couple of other samples I found on the web without being enlightened. Jonathan Dann has sample code using sortIndex and an NSTreeController, but updating the treeController doesn't involve rearranging its items first, so, it doesn't quite work.

Possible solutions I can see:

1. manually assigning new sortIndexes to all objects from the point of insertion through the end of the array / set immediately upon insertion of the moved objects, or: 2. copying the entire array after insertion and then using the copied array to assign new indexes:

for (Activity *anActivity in activitiesArrayCopy) {
[anActivity setValue:[NSNumber numberWithInt:[activitiesArrayCopy indexOfObject:anActiviity]] forKey:@"sortIndex"]
}

But, I think there's a cleaner, more elegant solution out there that I'm not seeing.

Any suggestions would be appreciated.


Thanks.

Brad


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/bradgibbs%40mac.com

This email sent to bradgi...@mac.com

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to