实际上我想在UITableView
中显示记录,记录总数可能会超过 100千。因此,每当用户滚动达到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行突然停止滚动。
是否有其他解决方案可以实现上述问题,提前致谢。
答案 0 :(得分:0)
为什么不允许用户以其他方式访问数据,例如:
这也许值得一提,因为它的数据如此庞大,您的用户是否真的可能会滚动到那么远的地方,如果必须这样做,是否会对用户体验造成负面影响?
为了论证,如果你想保护你的内存使用,你必须根据偏移量动态添加和删除单元格。标准的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。每次添加新单元格/删除旧单元格时,都要更新动态索引路径。它将是最上层单元格的indexPath。在此基础上,您可以计算当前“已分配”的单元格数量。以及从数组中提取单元格数据的点:
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方法,那就失败了我自己。