Сортировка строк с нулевым значением всегда по низу в столбце nstableview - PullRequest
2 голосов
/ 30 июня 2010

У меня есть NSTableview в моем приложении, содержащем несколько столбцов.Когда я щелкаю заголовок одного столбца, чтобы отсортировать его по возрастанию, строки с нулевым значением в этом столбце сортируются сверху, за которыми следуют строки с ненулевым значением в порядке возрастания.Если я щелкну по тому же столбцу, сначала строки с ненулевым значением будут показаны в порядке убывания, за которым следуют строки с нулевым значением.

Я хочу, чтобы строки с нулевым значением всегда были привязаныниз.Поэтому сначала должны быть представлены строки с ненулевым значением, отсортированные по возрастанию или по убыванию, а строки с нулевым значением должны быть сохранены внизу.Как это можно сделать наилучшим образом?

Сортировка в этом контексте - насколько я понимаю - выполняется NSArrayController * arrangedObject:.Так стоит ли подкласс NSArrayController и использовать собственный алгоритм сортировки в методе arrangedObjects:, или есть лучший способ получить результат, описанный выше?

Ответы [ 2 ]

0 голосов
/ 01 июля 2010

Спасибо большое.Как я упоминал выше, я всегда хочу, чтобы nil-значения были отсортированы снизу. Я использовал ваш код с CompareObject: следующим образом.

- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2 {
    if (NULL_OBJECT([object1 valueForKeyPath:[self key]]) && NULL_OBJECT([object2 valueForKeyPath:[self key]]))
        return NSOrderedSame;
    if (NULL_OBJECT([object1 valueForKeyPath:[self key]]))
        return NSOrderedDescending;
    if (NULL_OBJECT([object2 valueForKeyPath:[self key]]))
        return NSOrderedAscending;
    return [super compareObject:object1 toObject:object2];
}
0 голосов
/ 30 июня 2010

Я реализовал это в своем собственном приложении, создав собственный подкласс NSSortDescriptor, который, в конечном счете, и использует NSArrayController для своей сортировки. Реализация ниже, она не очень сложная, но обратите внимание, что она сортирует пустые строки до конца вместе с нулевыми строками. К сожалению, нет способа (по крайней мере, я знаю) указать подкласс дескриптора сортировки в Интерфейсном Разработчике, поэтому вам придется вручную создать его и вызвать setSortDescriptorPrototype: для соответствующего NSTableColumn в вашем методе awakeFromNib.

#define NULL_OBJECT(a) ((a) == nil || [(a) isEqual:[NSNull null]])

@interface MySortDescriptor : NSSortDescriptor {}
@end

@implementation MySortDescriptor

- (id)copyWithZone:(NSZone*)zone
{
    return [[[self class] alloc] initWithKey:[self key] ascending:[self ascending] selector:[self selector]];
}

- (id)reversedSortDescriptor
{
    return [[[[self class] alloc] initWithKey:[self key] ascending:![self ascending] selector:[self selector]] autorelease];
}

- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2
{
    if (NULL_OBJECT([object1 valueForKeyPath:[self key]]) || 
        [[object1 valueForKeyPath:[self key]] length] == 0)
        return ([self ascending] ? NSOrderedDescending : NSOrderedAscending);
    if (NULL_OBJECT([object2 valueForKeyPath:[self key]]) ||
        [[object2 valueForKeyPath:[self key]] length] == 0)
        return ([self ascending] ? NSOrderedAscending : NSOrderedDescending);
    return [super compareObject:object1 toObject:object2];
}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...