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