使用NSFetchedResultsController进行无限UITableView滚动

时间:2014-07-16 23:03:57

标签: ios objective-c uitableview nsfetchedresultscontroller

我尝试使用this方法实现无限滚动UITableView

解决方案的核心逻辑是:

  1. 要将tableview内容增加3倍,以便我们将内容的3个副本一个接一个地垂直放置。
  2. 每当到达滚动的顶端时,将滚动偏移移回到第二个副本的开头
  3. 当到达滚动的底端时,我们将滚动偏移移回到第二个副本的开头减去tableview的高度,这样我们最终会显示与现在相同的内容。
  4. 这意味着单个单元格插入或删除实际上会导致三次插入或删除。由于我的表的数据源由NSFetchedResultsController填充,因此会导致断言失败。

      

    更新后的现有部分中包含的行数(12)必须等于更新前该部分中包含的行数(15),加上或减去从该部分插入或删除的行数(插入0,删除1)并加上或减去移入或移出该部分的行数(0移入,0移出)。

    在这些情况下,是否有某种方法可以阻止程序崩溃?我非常感谢任何帮助/指针。感谢。

2 个答案:

答案 0 :(得分:0)

这在iOS中可能有点棘手,特别是当你刚开始时。关键是在通知tableview更改之前更新支持UITableView的数据源。

例如,如果您有NSArray支持您的桌面视图,那么您需要在桌面视图上调用reloadSection:之前删除或添加项目。

虽然它是最不优化的解决方案,但您的测试可以随意调用reloadData,这将忽略tableview缓存的内容,并根据支持tableview的内容强制重新计算。

答案 1 :(得分:0)

您可以使用NSFetchedResultsControllerDelegate方法controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:。插入\删除3个对象。

为了简单起见,您可以在表视图中返回3部分的数量(这将处理获得3个对象的副本)。然后在NSFetchedResultsControllerDelegate的所有部分的UITableView更新对象中(插入,删除或移动)。您应该使用NSFetchedResultsControllerDelegate中的行号,并对不同的部分应用所有更改3次。请务必使其与UITableView数据源方法tableView:numberOfRowsInSection:保持一致。