NSSortDescriptor - нажмите # и цифры в конце списка - iphone xcode - PullRequest
7 голосов
/ 30 января 2011

У меня есть табличное представление, которое показывает контакты, отсортированные по алфавитному порядку, и делит их на разделы.

я использую -

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:[dataSource keyName] ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

тогда для контактов без имени я использую знак # в качестве их первой буквы, поэтому все они будут сгруппированы в одну группу.

все отлично. Единственное, что мне нужно, это перенести раздел # в конец таблицы, как сейчас, в начале.

есть идеи?

спасибо заранее

Шани

1 Ответ

7 голосов
/ 28 июня 2012

Лучший способ сделать это - создать собственный дескриптор сортировки, используя sortDescriptorWithKey: ascending: comptor: метод. Это позволяет вам создать собственную функцию сравнения, которую вы указываете с помощью блока.

Сначала создайте функцию сравнения. Если вы никогда не программировали с блоками , сейчас самое время учиться!

NSComparisonResult (^myStringComparison)(id obj1, id obj2) = ^NSComparisonResult(id obj1, id obj2) {

    // Get the first character of the strings you're comparing
    char obj1FirstChar = [obj1 characterAtIndex:0];
    char obj2FirstChar = [obj2 characterAtIndex:0];

    // Check if one (but not both) strings starts with a '#', and if so, make sure that one is sorted below the other
    if (obj1FirstChar  == '#' && obj2FirstChar != '#') {
        return NSOrderedDescending;
    } else if (obj2FirstChar == '#' && obj1FirstChar != '#') {
        return NSOrderedAscending;
    } 
    // Otherwise return the default sorting order
    else {
        return [obj1 compare:obj2 options:0];
    }
};

Теперь, когда у вас есть функция сравнения, вы можете использовать ее для создания дескриптора сортировки:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:[dataSource keyName] ascending:YES comparator:myStringComparison];

Теперь вы можете использовать этот дескриптор сортировки так же, как и любой другой, и в вашем списке будут # элементы, отсортированные до конца!

...