Inline Arrays of NSSortDescriptors
NSSortDescriptor is Cocoa's standard class for sorting an NSTableView (or NSArray) by multiple criteria. Sort descriptors are created automatically when the user clicks on a column, but there are a number of situations where you need to create them in code. The API is really simple but the process of getting these things into the table is fairly verbose. Here's a clean and simple way to automate the process, using a category with varargs as input:
@interface NSSortDescriptor (CDCExtensions)
+ (NSArray *) ascendingDescriptorsForKeys: (NSString *)firstKey,...;
@end
You can use it like this:
NSArray *descriptors = [NSSortDescriptor
ascendingDescriptorsForKeys: @"subject", @"date", nil];
[tableView setSortDescriptors: descriptors];
Or this:
NSArray *descriptors = [NSSortDescriptor
ascendingDescriptorsForKeys: @"subject", @"date", nil];
NSArray *sorted = [someArray sortedArrayUsingDescriptors: descriptors];
Grab zip file with the the .h and .m files. Here's the implementation (formatting adjusted for site):
@implementation NSSortDescriptor (CDCAdditions)
+ (NSArray *) ascendingDescriptorsForKeys: (NSString *)firstKey,...
{
id returnArray = [[NSMutableArray arrayWithCapacity: 5] retain];
va_list keyList;
NSString * oneKey;
NSSortDescriptor * oneDescriptor;
if (firstKey)
{
oneDescriptor = [[NSSortDescriptor alloc] initWithKey: firstKey
ascending: YES];
[returnArray addObject: oneDescriptor];
[oneDescriptor release];
va_start (keyList, firstKey);
while (oneKey = va_arg(keyList, NSString *))
{
oneDescriptor = [[NSSortDescriptor alloc] initWithKey: oneKey
ascending: YES];
[returnArray addObject: oneDescriptor];
[oneDescriptor release];
}
va_end (keyList);
}
return [returnArray autorelease];
}
@end
Inline Arrays of NSSortDescriptors
Posted Mar 15, 2005 — 3 comments below
Posted Mar 15, 2005 — 3 comments below
Hayssam — Mar 15, 05 114
I think there might be a typo in your
> NSSortDescriptor * descriptor;
as "descriptor" is never used while "OneDescriptor" is used but not declared.
Thanks for sharing this snippet !
Scott Stevenson — Mar 16, 05 115
Scott Stevenson — Mar 16, 05 116