Cocoa and Objective-C: Up and Running (by me) is now available from O'Reilly.

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.




Technorati Profile
Copyright © Scott Stevenson 2004-2008