是否有一种简单的方法可以在uitableview中预加载所有单元格?
我需要这样做才能改变是否检查了所有单元格。如果我只使用cellForRowAtIndexPath,并且用户说取消选中所有单元格,然后检查可见单元格并再次开始滚动,则取消选择所选单元格或选择新加载的单元格。
似乎最简单的方法是在可能的情况下预加载所有单元格。
谢谢!
答案 0 :(得分:5)
不要将细胞用作数据库。
您的单元格只是数据的一个狭窄窗口。单元格只显示基础数据中的一些对象。如果您尝试预加载所有单元格,然后可以全部选择它们,UITableView可能会死于慢速死亡或慢速爬行。特别是如果我们正在谈论数百个条目。
如果要选择数据中的所有项目,可以直接调用数据来选择其对象。然后,使用reloadData
将数据重新加载到TableView中,如果一切设置正确,则单元格将显示所选状态。
阅读UITableView。看看Apple的样品。您需要查看视图和控制器之间的数据分离。
答案 1 :(得分:3)
不,你不能这样做。你似乎认为一个单元格代表一个特定的数据,但事实并非如此。当顶部单元格从屏幕滚动时,它通常被回收并作为底部单元格引入。因此,包含数百个项目的列表可能只会分配8个或9个单元并进行初始化。
您需要重新考虑应用程序的架构。当你“取消全部”时,它不应该改变单元格的可视状态,它应该改变单元格所代表的对象中的某些状态,然后当你在该索引路径加载对象的单元格时,你应该读取该状态并设置复选标记。
细胞视觉状态的变化应始终响应基础模型的变化。
答案 2 :(得分:3)
请重新阅读我wrote here给您之前的类似问题的答案,该问题解释了您的问题的一个解决方案。
同样,您应该考虑保留一组开/关设置。无论您想要什么,都可以使用NSMutableArray
或int
或BOOL
值的C数组。但听起来你需要一个数据模型。
您的-tableView:cellForRowAtIndexPath:
查找此数组的值。数组中的每个值都以某种方式对应于表中的一行。
如果您只有一个部分,那么您只需使用数组的i
元素来设置表视图的i
行的已检查状态。如果您使用NSMutableArray
来存储NSNumber
,则可以轻松处理调整大小。
如果您有多个部分,请保留一个数组数组。每个顶级数组对应一个部分。每个内部数组对应一个部分的行。
如果您使用NSMutableArray
来存储NSMutableArray
的{{1}},则可以非常轻松地处理调整大小和部分添加和删除。
方法NSNumber
然后根据数组的值设置带或不带复选标记的单元格。
拥有数据模型使您可以自由地以编程方式执行“全选”和“取消全选”按钮操作。
例如,当您单击按钮以“选择所有”单元格时:
循环遍历数组并将每个值设置为-tableView:cellForRowAtIndexPath:
或YES
或您最初选择的“on”标签。
调用1
,这是一种返回[tableView reloadData]
的方法,它将根据更新数组中的值状态设置单元格的复选标记状态。