2012-09-29 14 views
11

グループ化されたUITableViewのセクションのNSManagedObjectがあります。 このオブジェクトは属性 "name"と "createdAt"を持っています。 セクションタイトルでは「名前」を使用したいが、「createdAt」でソートする。 ドキュメントによると、最初のsortDescriptorキーはNSFetchedResultsControllerのsectionNameKeyPathでなければなりません。NSFetchedResultsController - セクション名と異なるソート順

2つのsortDescriptorsを使用することを推奨しましたが、動作しません。セクションはまだ名前でソートされています。

- (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; 
} 

答えて

38

フェッチ結果コントローラ(FRC)は、最初のソート記述子のみを使用してオブジェクトをセクションにグループ化(ソート)します。第2のソート記述子を追加して、各セクション内のオブジェクトをソートすることができます。

また、ソート記述子のキーパスは、FRCのsectionNameKeyPathと同じである必要があります(または、少なくとも同じ相対順序を生成する必要があります)。次のようにあなたのケースでは

は、先に進むことができます。

  1. 使用createdAt最初のソート記述子でsectionNameKeyPathようと
  2. 代わりcreatedAtnameプロパティを返すためにtitleForHeaderInSectionデリゲート関数を変更します。

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

注:あなたが同じnameを持つ複数のオブジェクトが異なるcreateAt値を持っている場合は、これらのグループ化されます上記の方法で異なるセクションに分けてください。それがあなたにとって問題であるかどうかはわかりません。

+0

素晴らしい!それはとても簡単です。いいえ、私は複数のsortDescriptorsの機能も理解していません。現在、私のオブジェクトの "名前"はユニークなので、この解決法は問題ありません。コードにも感謝します。 – Sebastian

+0

@セバスチャン:どうぞよろしくお願いいたします。 –

+0

答えをありがとう。 – coreDeviOS

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"]; 
関連する問題