大きな行セットのテーブル ビュー セクションを手動で計算することについて、Apple 開発フォーラムで興味深い議論が行われています。表示するには、開発者アカウントが必要です。
NSFetchedResultsController が DB 内のすべてのオブジェクトを取得しています...
開発者アカウントを持っていない人のために、Apple の技術者は、インデックス タイトルを含むエンティティを使用し、行に表示するエンティティとの対多関係を使用することを提案しています。
典型的な例は、インデックス セクションのタイトルが最初の文字 A、B、C である曲またはアーティストのコレクションです。
したがって、タイトル A のエンティティは、文字 A で始まる曲と対多の関係を持つことになります。
このメカニズムは、フェッチされた結果コントローラーを使用してすべての曲を取得すると同時に、インデックスの NSArray を取得するためのフェッチ要求を開始します。
NSFetchRequest *req = //fetch request for section entity
NSArray *sections = [MOC executeFetchRequest:req error:&error];
セクション数とセクション内の行を取得するのは非常に簡単です。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
NSInteger abc = [self.sections count];
return abc;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
CardSection *s = (CardSection*)[self.sections objectAtIndex:section];
NSInteger rows = [s.cards count];
return rows;
}
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
CardSection *s = [self.sections objectAtIndex:section];
NSString *title = s.title;
return title;
}
ただし、問題はインデックス パスの行のセルで始まります。
- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject obj = [_fetchedResultsController objectAtIndexPath:indexPath];
// build cell....
return cell;
}
明らかに、インデックス パスは計算されたセクションと行を参照しているため、フェッチされたコントローラーは範囲外になります。
もちろん、これはセクション エンティティを呼び出して NSSet 関係で特定のインデックス オブジェクトを要求することで解決できますが、この方法ではフェッチされたコントローラーを持つ利点が失われます。
誰かがこのアプローチを試みたのだろうか、そして彼はどうやって問題を解決したのだろうか.