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
Design Element
Inline Arrays of NSSortDescriptors
Posted Mar 15, 2005 — 3 comments below




 

Hayssam — Mar 15, 05 114

Hi!

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 Scotty the Leopard

Fixed, thanks. I had tweaked a few things to fit the code on the page, and this was an artifact of that. The code in the zip file was fine, though.

Scott Stevenson — Mar 16, 05 116 Scotty the Leopard

Update: I added some discussion about sorting NSArrays.




 

Comments Temporarily Disabled

I had to temporarily disable comments due to spam. I'll re-enable them soon.





Copyright © Scott Stevenson 2004-2015