настройка localizedCaseInsensitiveCompare - PullRequest
1 голос
/ 28 июня 2011

Я сортирую и разбиваю табличное представление по первой букве массива строк, как это делает приложение Контакты. Я использую Core Data и NSFetchedResultsController для управления таблицей. Я использую первую букву слова, и если буква не только проблема, то, когда я использую описание сортировки с localizedCaseInsensitiveCompare:, создается впечатление, что список разделов выглядит так: '...' Z '. Я хочу, чтобы знак # был в конце списка, а не в первом (как и в приложении «Контакты», опять же). Есть ли какой-нибудь творческий способ, которым я мог бы достичь этого?

Вот как я создаю NSFetchedResultsController:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:100];

NSSortDescriptor *sortDescriptorLetter = [[NSSortDescriptor alloc] initWithKey:@"sectionLetter" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptorLetter, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"sectionLetter" cacheName: nil]; // NOTE: set the cache name to nil for testing ...

aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

 NSError *error = nil;
 if (![self.fetchedResultsController performFetch:&error])
 ...

Ответы [ 2 ]

0 голосов
/ 22 июня 2012

Очевидно, что вы не можете настроить дескрипторы сортировки при использовании NSFetchedResultsController.Вы должны пойти со стандартными селекторами сортировки, такими как «localizedCaseInsensitiveCompare».

Способ, который я в итоге сделал, состоит в том, чтобы взять результаты NSFetchedResultsController и настроить шаблонный код для настройки tableView с моим собственным отображением indexPaths, где я сместил 0-й раздел в последний разделТаблица.Это немного работы, и может быть лучше забыть об использовании NSFetchedResultsController и загрузить все объекты напрямую.

0 голосов
/ 28 июня 2011

Вместо того, чтобы использовать селектор ‑localizedCaseInsensitiveCompare: для сравнения объектов, вы должны вместо этого инициализировать NSSortDescriptor, используя метод класса +sortDescriptorWithKey:ascending:comparator:.

Этот метод позволяет передать NSComparatorэто блок, содержащий код для сравнения двух объектов и их сортировки.Вы можете сравнивать их любым способом.

Если вы никогда раньше не использовали блоки, этот будет полезен.

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