8

索引付けをサポートするコアデータを使用したUITableViewを実装しようとしています(例:側面に表示される文字と、それらに付随するセクションヘッダー)。私はすべて使用してコアデータなしでこれを実装するには問題がない:インデックス付きのコアデータバックアップされたUITableView

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

私はまた、インデックスを使用せずに、コアデータに裏付けされたのUITableViewを実装する問題はありません。

私が理解しようとしているのは、2つをエレガントに組み合わせる方法です。明らかにコンテンツを索引付けして再セクションすると、標準の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

なぜ、firstNameをsectionNameKeyPathとして使用しないのですか? – gerry3

+0

sectionNameKeyPath!??!?!?!どのように私はそれを欠場した!うわー、それは素晴らしい作品です。私は自分でコーディングする前にドコをよく読んでいたはずです...それに戻ってきて、うまく動いています。私はできればあなたに+5000を与えるだろう;) – rustyshelf

関連する問題