我正在尝试实现一个支持索引的 Core Data 支持的 UITableView(例如:出现在侧面的字符,以及与它们一起出现的部分标题)。如果没有使用核心数据,我完全没有问题:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;
我在不使用索引的情况下实现由 Core Data 支持的 UITableView 也没有问题。
我想弄清楚的是如何优雅地将两者结合起来?显然,一旦您索引并重新分段内容,您就不能再使用标准 NSFetchedResultsController 来检索给定索引路径中的内容。因此,我将索引字母存储在 NSArray 中,将索引内容存储在 NSDictionary 中。这一切都可以很好地显示,但是在添加和删除行时我真的很头疼,特别是如何正确实现这些方法:
- (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 是开箱即用的,但我想要的是复制联系人应用程序等功能,其中索引是人名的第一个字母。