UITableView 通过删除现有记录来加载具有分页的记录



其实我想在UITableView中显示记录,记录总数可能超过10万条。因此,每次用户滚动到 70% 的记录(第 70 行)时,我都会以 100 条记录的块加载这些记录。

不想将现有的记录块保留在内存中,因此最初我加载了 2 个 100 条记录的块,当用户滚动到第 170 行时,我删除了前 100 条记录并加载了 1 个 100 条记录的块。

但我的问题是如何重置 indexPath 的值? 因为目前它的值是 170,但在加载 100 条记录的新块并删除前 100 条记录后,我希望它的值为 70。

我使用以下代码行找到了上述问题的解决方法。

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:70 inSection:indexPath.section] atScrollPosition:UITableViewScrollPositionBottom  animated:NO];

但是上面的代码行突然停止滚动。所以看起来卷轴突然停在第 70 行。

还有其他解决方案可以解决上述问题吗,提前感谢您。

为什么不允许用户以其他方式访问数据,例如:

  1. 搜索功能
  2. 数据的子分类

也许值得一问的是,既然数据量如此之大,你的用户真的有可能向下滚动那么远,如果他们必须这样做,它会对用户体验产生负面影响吗?

为了参数起见,如果要保护内存使用,则必须根据偏移量动态添加和删除单元格。标准的UITableview方法可以很好地为您做到这一点。

在任何情况下,您在任何时候分配的单元格数量都应该考虑您放入单元格的内容,例如图像与文本。如果是图像,那么 100k 将导致一个巨大的应用程序包(除非您根据需要从服务器中提取它们)。如果是文本,只需使用Apple自己的UITableView方法,因为它们会更有效率。

但是,如果您坚持这种方法,并且想要推出自己的自定义修复,则可以在UIScrollView中布局UIViews的负载,并使用UIScrollView的contentOffset来了解何时添加和删除单元格。单元格的实际添加应在屏幕外完成。

A. 在scrollViewDidScroll中,观察与cellHeights对齐的特定偏移量,例如

if(fabsf(y)%200==0){
   //add new cells below, drop old cells at the top
}

例如,如果您的单元格高度为 50px,则每 4 个单元格就会命中此方法。

B.每次添加新单元格/删除旧单元格时更新动态索引路径。它将是最上面的单元格的索引路径。在此基础上,您可以计算当前"分配"的单元格数量以及应从数组中提取单元格数据的点:

for (int n = dynamicIndexPath; n<dynamicIndexPath+numberOfCells; n++){
   //this is the window onto your data.
}

例如,添加 4 个新单元格时:

for (int n = dynamicIndexPath + numberOfCells-4; n<4; n++){
   //[self layoutNewCellWithData:massiveArray[n] atOffset:y];
}

这将是一种自主开发的UITableview(UIScrollView中的UIViews),您可以在其中自己处理出队。

但是,如果是我,我会寻找另一种攻击数据的方法,例如通过搜索或将数据分成更小组的某种方式。如果做不到这一点,我会使用Apple的UITableView方法,否则我会自己滚动。

最新更新