16

グループ化された UITableView のセクションに NSManagedObject があります。このオブジェクトには、属性「name」と「createdAt」があります。セクションのタイトルに UI で「name」を使用したいのですが、「createdAt」でソートされています。ドキュメントによると、最初の sortDescriptor キーは、NSFetchedResultsController の sectionNameKeyPath でもある必要があります。

2 つの 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) は、最初のソート記述子のみを使用して、オブジェクトをセクションにグループ化 (およびソート) します。2 番目のソート記述子を追加して、各セクション内のオブジェクトをソートできます。

また、ソート記述子のキー パスは、FRC のキー パスと同じでなければなりませんsectionNameKeyPath(または、少なくとも同じ相対順序を生成します)。

「Core Data Programming Guide」の「Creating a Fetched Results Controller」も参照してください。

... この例では、もう 1 つの NSSortDescriptor インスタンスを NSFetchRequest インスタンスに追加します。その新しいソート記述子から、NSFetchedResultsController の初期化時に sectionNameKeyPath と同じキーを設定します。フェッチされた結果コントローラーは、この初期ソート コントローラーを使用してデータを複数のセクションに分割するため、キーが一致する必要があります。

あなたの場合、次のように進めることができます:

  1. 最初のソート記述子createdAtとして使用sectionNameKeyPath します。

  2. の代わりにプロパティtitleForHeaderInSectionを返すようにデリゲート関数を変更します。namecreatedAt

     - (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 に答える