2009-11-07 88 views
0

有没有简单的方法来预先加载uitableview中的所有单元格?是否可以预先加载uitableview中的所有单元格?

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

看起来最简单的方法是预先加载所有单元格,如果可能的话。

谢谢!

回答

3

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

同样,你应该考虑保持一个开/关设置数组。无论您想要什么,您都可以使用NSMutableArrayintBOOL值的C数组。但它绝对听起来像你需要一个数据模型。您的-tableView:cellForRowAtIndexPath:查找此数组的值。数组中的每个值都以某种方式对应于表中的一行。

如果您只有一个部分,那么您可以简单地使用该数组的第i th元素来设置表视图的第i行的选中状态。如果您使用NSMutableArray来存储NSNumber,您可以轻松处理大小调整。

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

如果您使用NSMutableArray来存储NSMutableArray s的NSNumber s,您可以轻松处理调整大小和添加和删除部分。

方法-tableView:cellForRowAtIndexPath:然后根据数组的值设置带或不带检查标记的单元格。

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

例如,当你点击一个按钮,“全选”细胞:

  1. 循环遍历数组,每个值设置为YES1或任何“上”的标签你选择最初。

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

3

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

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

您的单元格的视觉状态的变化应始终响应您的基础模型的变化。

5

请勿使用单元格作为数据库。

你的细胞只是一个狭窄的窗口到你的数据。这些单元格仅显示底层数据中的一些对象。如果您尝试预先加载所有单元格以便可以全部选中它们,则UITableView可能会死亡缓慢或爬行缓慢。特别是如果我们正在谈论数百个条目。

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

阅读UITableView。看看苹果的样品。您需要查看从视图和控制器中分离的数据。

相关问题