不确定我是否完全理解你的问题,但我在我的应用程序中做了类似的事情,这是我如何让它工作的:
首先是 fetchedResultsController 方法,在这里我根据我想要做的事情来设置排序描述和谓词。在这种情况下,我想按发行日期对电影标题进行排序,然后按名称排序。然后用我的谓词抓取特定“类型”和某个“发布日期”范围内的实体。
在我的 fetchresultscontroller 定义中,您将 sectionNameKeyPath 设置为“releaseDate”,因此我的部分标题将基于日期。
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController_ != nil) {
return fetchedResultsController_;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSSortDescriptor *sortByReleaseDate = [[NSSortDescriptor alloc] initWithKey:@"releaseDate" ascending:NO];
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByReleaseDate,sortByName, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortByName release];
[sortByReleaseDate release];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(type == 'Movies') AND (releaseDate <= %@) AND (releaseDate >= %@)", [NSDate date], [NSDate dateWithTimeIntervalSinceNow:kOneDayTimeInterval*-30]];
[fetchRequest setPredicate:predicate];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Movie" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"releaseDate" cacheName:nil];
...// Perform and return fetch here, error handling etc...
return fetchedResultsController_;
}
然后在我的表格视图数据源委托方法中,在将我的 NSDate 转换为 NSString 之后,我返回每个标题的实际标题(请记住,您必须为表格视图标题标题返回 NSString。
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSString *rawDateStr = [[[self.fetchedResultsController sections] objectAtIndex:section] name];
//convert default date string to NSDate...
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZ"];
NSDate *date = [formatter dateFromString:rawDateStr];
//convert NSDate to format we want...
[formatter setDateFormat:@"d MMMM yyyy"];
NSString *formattedDateStr = [formatter stringFromDate:date];
return formattedDateStr;
}
因此,如果我想更改数据的显示方式,例如按 titleName 组织,我会将 fetchedResultsController 对象更改为:
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"titleName" cacheName:nil];
并修改我的 tableview:titleForHeaderInSection: 数据源方法以简单地返回 titleName(这已经是一个字符串):
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [[[self.fetchedResultsController sections] objectAtIndex:section] name];
}
我希望这可以帮助您找到特定问题的解决方案。
干杯,
罗格