使用 NSSortDescriptor、Core Data 和 NSFetchedResultsController 按日期和名称对 UITableView 进行排序
Posted
技术标签:
【中文标题】使用 NSSortDescriptor、Core Data 和 NSFetchedResultsController 按日期和名称对 UITableView 进行排序【英文标题】:Sorting a UITableView by date and name with NSSortDescriptor, Core Data and NSFetchedResultsController 【发布时间】:2014-04-11 22:51:12 【问题描述】:我有一个当前按日期排序的 UITableViewController。我正在使用Core Data
和NSFetchedResultsController
,我还想进一步介绍按名称排序。
我的模型是:
交易实体 与日期实体的关系 与人实体的关系
我的fetchedResultsController
代码是这样的:
- (NSFetchedResultsController *)fetchedResultsController
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
if (_fetchedResultsController != nil)
return _fetchedResultsController;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
fetchRequest.entity = entity;
if ([self.timelineSearchBar.text length] > 0)
NSPredicate *predName = [NSPredicate predicateWithFormat:@"whoBy.name CONTAINS[c] %@", self.timelineSearchBar.text];
NSPredicate *predOccasion = [NSPredicate predicateWithFormat:@"occasion.title CONTAINS[c] %@", self.timelineSearchBar.text];
NSPredicate *predSubOccasion = [NSPredicate predicateWithFormat:@"subevent.title CONTAINS[c] %@", self.timelineSearchBar.text];
NSPredicate *compPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predName, predOccasion, predSubOccasion]];
[fetchRequest setPredicate:compPredicate];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"dates.dateOfEvent" ascending:NO];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];
fetchRequest.fetchBatchSize = 20;
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"sectionDateFormatter" cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
所以sortDescriptor
现在正在对日期进行排序。 sectionTitles
是从 NSDate 到 NSString 的转换。
我尝试使用以下代码添加另一个sortDescriptor
:
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"whoBy.name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
fetchRequest.sortDescriptors = @[[NSArray arrayWithObjects:sort, sortByName, nil]];
应用程序因此错误而崩溃:
-[__NSArrayI key]: unrecognized selector sent to instance 0x1702237c0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI key]: unrecognized selector sent to instance 0x1702237c0'
我想要实现的只是确保按日期排序的条目也按名称排序。
非常感谢任何指导。
【问题讨论】:
【参考方案1】:您正在设置排序描述符数组的数组。修正这一行:
fetchRequest.sortDescriptors = @[[NSArray arrayWithObjects:sort, sortByName, nil]];
到:
fetchRequest.sortDescriptors = @[sort, sortByName];
【讨论】:
非常感谢@thom_ek - 这真的很完美 - 很棒的收获,感谢您的帮助 - 抱歉这个基本问题!以上是关于使用 NSSortDescriptor、Core Data 和 NSFetchedResultsController 按日期和名称对 UITableView 进行排序的主要内容,如果未能解决你的问题,请参考以下文章
Core Data NSSet 对象的 NSSortdescriptor
NSSortDescriptor 对 Core Data NSSet 对象进行排序的最有效方法
使用 NSSortDescriptor 对 NSOrderedSet 进行排序