2012-09-29 3 views
11

그룹화 된 UITableView의 섹션에 NSManagedObject가 있습니다. 이 개체에는 "name"및 "createdAt"특성이 있습니다. 섹션 제목에 대해 "이름"을 사용하고 싶지만 "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. 사용 createdAt 첫 번째 정렬 설명에 sectionNameKeyPath로하고.
  2. createdAt 대신 name 속성을 반환 할 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"]; 
관련 문제