是否可以在uitableview中预加载所有单元格?

时间:2009-11-07 06:39:36

标签: iphone objective-c uitableview

是否有一种简单的方法可以在uitableview中预加载所有单元格?

我需要这样做才能改变是否检查了所有单元格。如果我只使用cellForRowAtIndexPath,并且用户说取消选中所有单元格,然后检查可见单元格并再次开始滚动,则取消选择所选单元格或选择新加载的单元格。

似乎最简单的方法是在可能的情况下预加载所有单元格。

谢谢!

3 个答案:

答案 0 :(得分:5)

不要将细胞用作数据库。

您的单元格只是数据的一个狭窄窗口。单元格只显示基础数据中的一些对象。如果您尝试预加载所有单元格,然后可以全部选择它们,UITableView可能会死于慢速死亡或慢速爬行。特别是如果我们正在谈论数百个条目。

如果要选择数据中的所有项目,可以直接调用数据来选择其对象。然后,使用reloadData将数据重新加载到TableView中,如果一切设置正确,则单元格将显示所选状态。

阅读UITableView。看看Apple的样品。您需要查看视图和控制器之间的数据分离。

答案 1 :(得分:3)

不,你不能这样做。你似乎认为一个单元格代表一个特定的数据,但事实并非如此。当顶部单元格从屏幕滚动时,它通常被回收并作为底部单元格引入。因此,包含数百个项目的列表可能只会分配8个或9个单元并进行初始化。

您需要重新考虑应用程序的架构。当你“取消全部”时,它不应该改变单元格的可视状态,它应该改变单元格所代表的对象中的某些状态,然后当你在该索引路径加载对象的单元格时,你应该读取该状态并设置复选标记。

细胞视觉状态的变化应始终响应基础模型的变化。

答案 2 :(得分:3)

请重新阅读我wrote here给您之前的类似问题的答案,该问题解释了您的问题的一个解决方案。

同样,您应该考虑保留一组开/关设置。无论您想要什么,都可以使用NSMutableArrayintBOOL值的C数组。但听起来你需要一个数据模型。

您的-tableView:cellForRowAtIndexPath:查找此数组的值。数组中的每个值都以某种方式对应于表中的一行。

如果您只有一个部分,那么您只需使用数组的i元素来设置表视图的i行的已检查状态。如果您使用NSMutableArray来存储NSNumber,则可以轻松处理调整大小。

如果您有多个部分,请保留一个数组数组。每个顶级数组对应一个部分。每个内部数组对应一个部分的行。

如果您使用NSMutableArray来存储NSMutableArray的{​​{1}},则可以非常轻松地处理调整大小和部分添加和删除。

方法NSNumber然后根据数组的值设置带或不带复选标记的单元格。

拥有数据模型使您可以自由地以编程方式执行“全选”和“取消全选”按钮操作。

例如,当您单击按钮以“选择所有”单元格时:

  1. 循环遍历数组并将每个值设置为-tableView:cellForRowAtIndexPath:YES或您最初选择的“on”标签。

  2. 调用1,这是一种返回[tableView reloadData]的方法,它将根据更新数组中的值状态设置单元格的复选标记状态。

    < / LI>