自定义localizedCaseInsensitiveCompare

时间:2011-06-28 07:28:36

标签: objective-c core-data iphone

我正在使用字符串数组的第一个字母对tableview进行排序和分区,就像Contacts应用程序一样。我正在使用Core Data和NSFetchedResultsController来驱动tableview。我使用单词的第一个字母,如果字母不是唯一的问题是,当我使用localizedCaseInsensitiveCompare:的排序描述时,它似乎生成了以下部分的列表:'#','A','B '...'Z'。我希望#来到列表的末尾,而不是第一个(就像Contacts应用程序一样)。有什么创造性的方法可以实现这个目标吗?

以下是我创建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 :(得分:0)

您应该使用‑localizedCaseInsensitiveCompare:类方法初始化NSSortDescriptor,而不是使用+sortDescriptorWithKey:ascending:comparator:选择器来比较对象。

此方法允许您传入NSComparator,这是一个包含代码的块,用于比较两个对象并对其进行排序。你可以任意比较它们。

如果您以前从未使用过阻止,那么this会有所帮助。

答案 1 :(得分:0)

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

我最终这样做的方法是获取NSFetchedResultsController结果并调整样板代码以使用我自己的indexPaths映射设置tableView,其中我将第0部分偏移到表的最后部分。这有点工作,忘记使用NSFetchedResultsController并直接加载所有对象可能更好。