我正在使用字符串数组的第一个字母对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])
...
答案 0 :(得分:0)
您应该使用‑localizedCaseInsensitiveCompare:
类方法初始化NSSortDescriptor
,而不是使用+sortDescriptorWithKey:ascending:comparator:
选择器来比较对象。
此方法允许您传入NSComparator
,这是一个包含代码的块,用于比较两个对象并对其进行排序。你可以任意比较它们。
如果您以前从未使用过阻止,那么this会有所帮助。
答案 1 :(得分:0)
显然,在使用NSFetchedResultsController时无法自定义排序描述符。您必须使用标准排序选择器,例如“localizedCaseInsensitiveCompare”。
我最终这样做的方法是获取NSFetchedResultsController结果并调整样板代码以使用我自己的indexPaths映射设置tableView,其中我将第0部分偏移到表的最后部分。这有点工作,忘记使用NSFetchedResultsController并直接加载所有对象可能更好。