8

인덱싱을 지원하는 코어 데이터 백업 UITableView를 구현하려고합니다 (예 : 측면에 나타나는 문자 및 함께 나타나는 섹션 헤더). 나는 모든 사용하여 코어 데이터없이 구현에 아무런 문제가 없습니다 :인덱싱을 사용하는 코어 데이터 백업 된 iITableView

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; 
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView; 

나는 또한 색인을 사용하지 않고 핵심 데이터에 의해 백업됩니다 jQuery과 구현 아무런 문제가 없습니다.

내가 알아 내려고하는 것은 두 가지를 우아하게 결합하는 방법입니다. 컨텐츠를 인덱싱하고 다시 섹션을 다시 작성하면 더 이상 표준 NSFetchedResultsController를 사용하여 지정된 인덱스 경로에서 항목을 검색 할 수 없습니다. 그래서 NSArray에 NSArray와 색인 된 내용에 색인 문자를 저장합니다. 이 모두 표시 잘 작동하지만, 특별히 제대로 이러한 방법을 구현하는 방법, 행 추가 및 삭제에 올 때 나는 진짜 두통이 : 그것은 나를 돌아 오는 것 인덱스 경로 때문에

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller; 

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath; 

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type; 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller; 

것과 아무 상관이 없다 핵심 데이터. 사용자가 행을 추가 할 때 NSArray 및 NSDictionary 인덱스를 다시 작성하기 만하면됩니다.하지만 삭제할 때 동일한 작업을 수행하면 전체 애플리케이션이 손상됩니다.

간단한 패턴이 있습니까/예 제가 제대로 작동하지 못하고 있습니까?

편집 : 명확히하기 위해 NSFetchedResultsController가이 작업을 수행한다는 것을 알고 있지만 원하는 것은 연락처 앱과 같은 기능을 복제하는 것입니다. 여기서 인덱스는 사람의 이름의 첫 글자입니다.

답변

20

섹션/색인을 가져 오려면 CoreData NSFetchedResultsController를 사용해야합니다. 이 같은 섹션 이름을 얻을 수 있습니다, 그리고

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
initWithKey:@"name" // this key defines the sort 
ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext 
sectionNameKeyPath:@"name" // this key defines the sections 
cacheName:@"Root"]; 
aFetchedResultsController.delegate = self; 
self.fetchedResultsController = aFetchedResultsController; 

:
당신은 가져 오기 요청 섹션 키를 지정할 수 있습니다 (나는 그것이 첫 번째 정렬 키와 일치하는 생각)

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

그리고 섹션 인덱스 현재 위치 :

내용에
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section]; 
[sectionInfo indexTitle]; // this is the index 

변경 그냥 테이블을 업데이트 할 필요가 있음을 나타냅니다

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView reloadData]; 
} 

UPDATE
하지 섹션 헤더에 대한 색인과 빠른 인덱스 스크롤에 대한이 유일한 작품.
섹션 머리글과 색인에 대한 첫 번째 문자를 구현하는 방법에 대한 자세한 내용과 자세한 내용은 "첫 번째 문자를 섹션 이름으로 사용하는 방법"을 참조하십시오. this answer을 참조하십시오.

+0

나는 내가 충분히 자신을 분명히하지 않았다고 생각한다. 색인이 사람의 첫 번째 글자 인 연락처 응용 프로그램처럼 보이기를 바랍니다. – rustyshelf

+0

그렇다면 왜 sectionNameKeyPath로 이름을 사용하지 않는 것입니까? – gerry3

+0

sectionNameKeyPath! ?? !?! ??! 도대체 내가 그것을 그리워 했어! 와우는 훌륭하게 작동합니다. 나는 내 자신을 코딩하기 전에 더 나은 doco를 읽었어야했는데 ... 되돌아 왔고 감미롭 게 작동하고있다. 내가 할 수 있다면 당신에게 +5000 줄 것입니다;) – rustyshelf