Re: Sorting contents of an NSCollectionView
Re: Sorting contents of an NSCollectionView
- Subject: Re: Sorting contents of an NSCollectionView
- From: Eli Bach <email@hidden>
- Date: Thu, 4 Mar 2010 14:19:00 -0700
On Mar 3, 2010, at 3:39 PM, Eli Bach wrote:
> I have a core-data app, with a view that shows a managed object, along with an NSCollectionView displaying related managed objects in 1 column, all hooked together primarily with bindings.
>
> This works fine (selecting different objects automatically updates the collectionview and I can add/edit/delete related objects).
>
> However, I would like to present the related records in the same order each time, as well as have new objects appear in a predicable location (namely, at one 'end' of the collectionview. I have an 'order' attribute, with NSInteger16 values, that I want to sort on.
>
> Just adding a NSSortDescriptor to the NSArrayController that the NSCollectionView gets it's managed objects from only partially works:
>
> 1) it ONLY does the sort if I have a button that changes the sort AFTER the array is fully populated. Setting the sortDescriptor on the NSArrayController when the view loads, or even as the root managed object is changed, doesn't result in the collectionview being sorted
>
> 2) adding or deleting a related record [removing/adding objects for the collectionview] randomizes the order of the objects presented in the collectionview [either by calling add: on the NSArrayController or directly creating a new NSManagedObject for the relation]. The object is presented/removed, but the order is always rearranged randomly.
>
> I've even tried (programmatically):
> -add/delete record
> -clear sort descriptor
> -set sort descriptor
>
> and it does do the sort. It only applies the sort if I hit a button that changes the sortDescriptor on the NSArrayController AFTER the collectionview gets fully populated.
>
> Any ideas on the best way to keep the nsarraycontroller and/or the nscollectionview sorted all the time?
To follow up on this, I've found what seems to be a stupid 'solution' to this, namely subclass NSArrayController and override one method with this:
- (NSArray *)arrangeObjects:(NSArray *)objects
{
NSArray * returnValue = objects;
NSArray * sortDescriptors = [self sortDescriptors];
if ((sortDescriptors != nil) && ([sortDescriptors count] > 0))
{
returnValue = [objects sortedArrayUsingDescriptors:sortDescriptors];
}
else
{
returnValue = [super arrangeObjects:objects];
}
return returnValue;
}
This results in the collectionview being sorted.
But I expected the arraycontroller to do this automatically just by setting sortdescriptor, and perhaps setAutomaticallyRearrangesObjects:YES, on the arraycontroller, but it doesn't seem to reliably apply the sort by itself.
Am I misunderstanding NSArrayController, or binding the collectionview to the wrong part [it's bound to arrangedObjects], or a bug in NSArrayController?
Eli
_______________________________________________
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