Сортировка динамически создаваемых данных в NSTableView - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть NSTableView, который содержит несколько столбцов, каждый из которых я настроил для сортировки, сопоставляя ключ сортировки столбца со свойством в моей модели и предоставляя селектор сравнения:. Это прекрасно работает для тех столбцов, которые имеют прямое сопоставление со свойством NSString или NSInteger в моей модели.

Однако у меня есть пара столбцов, которые фактически являются агрегатами данных модели, т.е. мой метод objectValueForTableColumn будет копаться в модели и часто использует два или более свойств для генерации соответствующей строки NSString для отображения в этой строке / столбце.

Я пытался отсортировать эти столбцы, но я не уверен, что идет в ключ сортировки или селектор. Я пытался использовать одно из имен свойств, пытался использовать сравнение :, et c ... но код либо ничего не делает, либо генерирует исключение.

Я прочитал документацию Apple по сортировке NSTableView и искал в Интернете примеры, но не совсем понятно, как следует обращаться с этой ситуацией. Как мне сопоставить эти столбцы с ключом и как происходит сравнение. Как уже упоминалось, данные, отображаемые в таблице, представляют собой строку, которая может показаться сортируемой с помощью сравнения: или есть какой-то механизм для предоставления пользовательской функции сравнения?

Спасибо!

1 Ответ

0 голосов
/ 24 апреля 2020

Какао предоставляет встроенные дескрипторы сортировки, но они обрабатывают только базовые c типы данных: строки, даты, числа. В вашем случае вам потребуется определить собственный дескриптор сортировки и передать его в таблицу - ваша модель данных не является простым типом данных. Все, что делает дескриптор сортировки - это принимает два значения и сообщает, является ли значение 1 больше значения 2, меньше или равны ли они. Это будет выглядеть примерно так:

- (NSSortDescriptor*)myCustomSortDescriptor
{
    if (_myCustomSortDescriptor == nil) {
        NSComparisonResult (^myModelSortBlock)(id, id) = ^NSComparisonResult(id obj1, id obj2) {
            //
            // Here you have two objects from your model, i.e. the
            // the two rows that NSTableView wants to check the order of.
            // This is where your custom comparison goes. Then you return one of:
            // 
            if (obj1 < obj2)
                return NSOrderedAscending;
            else if (obj1 > obj2)
                return NSOrderedDescending;
            else
                return NSOrderedSame; // they must be the same
        };
        _myCustomSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self"
                                                                ascending:YES
                                                               comparator:myModelSortBlock];
    }
    return _myCustomSortDescriptor;
}

Для удобства я упаковал это в метод, но вы можете определить его где угодно. Затем вы передаете свой собственный дескриптор сортировки в таблицу.

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