Objective c 定制本地化CaseInsensitiveCompare

Objective c 定制本地化CaseInsensitiveCompare,objective-c,core-data,iphone,Objective C,Core Data,Iphone,我正在使用字符串数组的第一个字母对tableview进行排序和分区,就像Contacts应用程序一样。我正在使用核心数据和NSFetchedResultsController来驱动tableview。我使用单词的第一个字母,如果这个字母不是唯一的问题,那么当我使用带有localizedCaseInsensitiveCompare:的排序描述时,它似乎会生成带有以下内容的节列表:“#”、“a”、“B”…”Z’。我希望#出现在列表的末尾,而不是第一个(就像联系人应用程序一样)。我有没有什么创造性的方

我正在使用字符串数组的第一个字母对tableview进行排序和分区,就像Contacts应用程序一样。我正在使用核心数据和NSFetchedResultsController来驱动tableview。我使用单词的第一个字母,如果这个字母不是唯一的问题,那么当我使用带有localizedCaseInsensitiveCompare:的排序描述时,它似乎会生成带有以下内容的节列表:“#”、“a”、“B”…”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])
 ...

与其使用
-localizedCaseInsensitiveCompare:
选择器来比较对象,不如使用
+sortDescriptorWithKey:ascending:comparator:
类方法初始化
NSSortDescriptor

此方法允许您传入一个
NSComparator
,该块包含用于比较两个对象并对其排序的代码。你可以用任何你喜欢的方式来比较它们


如果您以前从未使用过块,将非常有用。

显然,在使用NSFetchedResultsController时,您无法自定义排序描述符。您必须使用标准的排序选择器,如“localizedCaseInsensitiveCompare”

我最终这样做的方式是使用NSFetchedResultsController结果并调整样板代码,以便使用我自己的IndExpath映射设置tableView,其中我将第0部分设置为表的最后一部分。这需要做一点工作,最好忘记使用NSFetchedResultsController,直接加载所有对象