繁体   English   中英

使用NSFetchedResultsController的无限UITableView滚动

[英]Infinite UITableView Scroll with NSFetchedResultsController

我正在尝试使用方法来实现无限滚动的UITableView

该解决方案的核心逻辑是:

  1. 将tableview的内容增加3倍,以便我们将3份内容的副本垂直放置。
  2. 每当到达滚动的顶端时,将滚动偏移移回第二个副本的开头
  3. 当到达滚动的最底端时,我们将滚动偏移移回到第二个副本的开头减去表视图的高度,以便最终显示与现在相同的内容。

这意味着单个单元格的插入或删除实际上会导致三个插入或删除。 由于我表的数据源是由NSFetchedResultsController填充的,因此会导致断言失败。

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

在这种情况下,有什么方法可以阻止程序崩溃? 我真的很感谢任何帮助/指针。 谢谢。

在iOS中,这可能会有些棘手,尤其是在您刚入门时。 关键是在通知更改之前,更新支持UITableView的数据源。

例如,如果您有一个支持表视图的NSArray ,则在对表reloadSection:调用reloadSection:之前,您需要删除或添加项目。

尽管它是最不优化的解决方案,但是您的测试可以随意调用reloadData ,它会忽略表视图已缓存的内容,并根据支持表视图的内容强制其重新计算。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM