16

对于分组的 UITableView 中的部分,我有一个 NSManagedObject。该对象具有属性“name”和“createdAt”。我想在 te UI 中使用“名称”作为部分标题,但按“createdAt”排序。根据文档,第一个 sortDescriptor 键也必须是 NSFetchedResultsController 的 sectionNameKeyPath。

我建议使用两个 sortDescriptor,但它不起作用。这些部分仍按名称排序。

- (NSFetchedResultsController *)fetchedResultsController {
  if (_fetchedResultsController != nil) {
      return _fetchedResultsController;
  }

  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
  NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:[CoreDataHelper instance].managedObjectContext];
  [fetchRequest setEntity:entity];

  NSSortDescriptor *sortName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
  NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES];

  [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortName, sortDate, nil]];

  [fetchRequest setFetchBatchSize:20];

  NSFetchedResultsController *theFetchedResultsController =
  [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:[CoreDataHelper instance].managedObjectContext sectionNameKeyPath:@"name"
                                               cacheName:@"Root"];
  self.fetchedResultsController = theFetchedResultsController;

  return _fetchedResultsController;
}
4

2 回答 2

40

获取结果控制器 (FRC) 仅使用第一个排序描述符将对象分组(和排序)到部分中。可以添加第二个排序描述符来对每个部分中的对象进行排序。

此外,排序描述符的键路径必须与sectionNameKeyPathFRC 的相同(或至少生成相同的相对排序)。

另请参阅“核心数据编程指南”中的创建获取结果控制器:

...在本例中,您向 NSFetchRequest 实例添加了一个 NSSortDescriptor 实例。您在 NSFetchedResultsController 的初始化中设置与新排序描述符中的 sectionNameKeyPath 相同的键。fetched results 控制器使用这个初始排序控制器将数据分成多个部分,因此要求键匹配。

在您的情况下,您可以执行以下操作:

  1. 在第一个排序描述符中使用createdAtassectionNameKeyPath 和。

  2. 修改titleForHeaderInSection委托函数以返回name属性而不是createdAt

     - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
         id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section];
         return [[[sectionInfo objects] objectAtIndex:0] name];
     }
    

注意:如果您有多个具有相同name但不同createAt值的对象,这些对象将使用上述方法分组到不同的部分。我不知道这对你来说是不是一个问题。

于 2012-09-30T09:05:13.227 回答
0

您快到了。您需要在 initWithFetchRequest 调用中定义 sectionNameKeypath。

    NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDate]];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[CoreDataHelper instance] sectionNameKeyPath:@"name"];
于 2012-09-29T22:40:09.460 回答