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