2012-09-29 39 views
11

我有一個NSManagedObject用於分組UITableView中的部分。 該對象具有「名稱」和「createdAt」屬性。 我想在te UI中使用「名稱」作爲節標題,但按「createdAt」排序。 根據文檔,第一個sortDescriptor鍵也必須是NSFetchedResultsController的sectionNameKeyPath。NSFetchedResultsController - 與部分名稱不同的排序順序

我建議使用兩個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)僅使用第一個排序描述符將對象分組(並排序)爲段。可以添加第二個排序描述符來對每個節內的對象進行排序。

此外,排序描述符的關鍵路徑必須與FRC的sectionNameKeyPath(或至少生成相同的相對排序)相同。

在你的情況,你可以進行如下操作:在第一個排序描述符

  1. 使用createdAtsectionNameKeyPath
  2. 修改titleForHeaderInSection委託功能,而不是返回createdAtname屬性:

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

@Sebastian:不客氣。 –

+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"]; 
相關問題