Установка и поддержка первого SortDescriptor для NSTableView - PullRequest
1 голос
/ 06 декабря 2011

У меня есть NSTableView со столбцами, привязанными к NSArrayController.

В табличном представлении отображается список сообщений электронной почты:

  • Пометить, если не прочитано
  • Тема
  • Размер вложения

Пользователь может щелкнуть столбец Размер вложения, чтобы отсортировать список, но я бы хотел, чтобы таблица по всегда сортировалась по "флажок «непрочитано» , чтобы непрочитанные сообщения всегда оставались вверху списка.

Я не привязывал дескрипторы сортировки контроллера массивов ни к чему, но сортировка таблиц работает волшебным образом, щелкая столбцы таблицы(Зачем?).Можно ли как-то перехватить установку дескрипторов сортировки контроллера массива и вставить сначала «непрочитанный» дескриптор сортировки?

Пример таблицы, отсортированной по размеру вложения:

UNREAD▼ SUBJECT ATTACHMENT SIZE▼
------  ------- ------------------
  yes   Hello.. 110kb
  yes   Test...  90kb

  no    Foobar  200kb
  no    Hey     100kb
  no    Test2    10kb

Ответы [ 2 ]

0 голосов
/ 14 мая 2012

Я думаю, что вы можете просто установить массив sortDescriptors на вашем контроллере массива во время awakeFromNib.Нет необходимости форсировать arrangeObjects:, эта функциональность полностью встроена.

- (void)awakeFromNib {
    [super awakeFromNib];
    NSSortDescriptor *unreadSorter = [[NSSortDescriptor sortDescriptorWithKey:@"isUnread" ascending:NO)] autorelease];
    NSArray *arrayOfSortDescriptors = [NSArray arrayWithObject:unreadSorter];
    [self setSortDescriptors:arrayOfSortDescriptors];
}

Столбцы по-прежнему будут сортироваться при нажатии на заголовок столбца.

0 голосов
/ 08 декабря 2011

Ну, причина, по которой он "просто работает", заключается в том, что столбцы таблицы вызывают setSortDescriptors: в связанном NSArrayController.

Предполагая, что вы хотите, чтобы таблица оставалась сортируемой, но вы всегда хотите отсортировать по "непрочитанным", вот как я бы это сделал:

Во-первых, подкласс NSArrayController и переопределение arrangeObjects:

- (NSArray *)arrangeObjects:(NSArray *)objects {

    NSMutableArray *oldSorted = [[super arrangeObjects:objects] mutableCopy];
    NSMutableArray *newSorted = [NSMutableArray arrayWithCapacity:[oldSorted count]];

    for (id anObject in oldSorted)
        if ([[anObject valueForKey:@"isUnread"] boolValue])
            [newSorted addObject:anObject];

    [oldSorted removeObjectsInArray:newSorted];
    [newSorted addObjectsFromArray:oldSorted];
    [oldSorted release];

    return newSorted;
}

Это помещает непрочитанные сообщения в" верх "(начало массива),Я не уверен, что это самый эффективный алгоритм сортировки, но я считаю, что это правильный путь.

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