使用 NSFetchedResultsController 时如何获取每个部分的一条记录

Posted

技术标签:

【中文标题】使用 NSFetchedResultsController 时如何获取每个部分的一条记录【英文标题】:How to get one record per section when using NSFetchedResultsController 【发布时间】:2014-11-13 11:41:37 【问题描述】:

我正在开发一个使用 Core Data 的 ios 应用程序,我想使用 UITableView 显示一个实体。

为此,我正在使用 NSFetchedResultsController。 我想要实现的目标是在其部分中显示每条记录。基本上我想要每节 1 行。

我正在努力的方法是:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

因为我想在计算numberOfSectionsInTableView的时候有这段代码:


    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];

并且我想在计算 numberOfRowsInSection 时使用return 1(显然我不能将indexPath.section传递给numberOfSectionsInTableView)。 在这个问题/情况下的方法是什么?谢谢。

【问题讨论】:

【参考方案1】:

嗯,

显然,您将拥有与对象一样多的部分:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    return self.fetchedResultController.fetchedObjects.count;

那么,你将只有一行/一节,因为这是你想要的

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

   return 1;

然后在 cellForRowAtIndexPath 中使用 indexPath.section 作为 rowIndex,使用 indexPath.row 作为 sectionIndex。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    NSIndexPath * correctedIP = [NSIndexPath indexPathForRow:indexPath.section inSection:0];

    id myItem =  [self.fetchedResultController objectAtIndexPath: correctedIP];
/* ... */


【讨论】:

更正后的 IP 不应交换行和节。它应该对行使用section,对部分使用0。是的,它可能总是为零,但最好明确地做到这一点。 它按预期工作。非常感谢@Fogmeister 和 Florian Burel 的快速和正确回复。你太棒了。

以上是关于使用 NSFetchedResultsController 时如何获取每个部分的一条记录的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存竞争条件错误

在 Swift 3 中难以配置 NSFetchedResultsController

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?