UITableViewCell被冻结(不用新数据重新渲染)。怎么修?

时间:2013-10-07 03:03:12

标签: iphone ios objective-c uitableview

有一些tableViewCell冻结的问题。我有一个表格视图单元格,其中包含一系列练习。当我在另一个viewController上添加一个新练习时,然后回到这个列出所有练习的tableViewController,相应的单元格被冻结(见截图)。然后,如果我调用[self.tableCell reloadData],那个单元格永远不会刷新。

这很奇怪,因为如果违规单元格是索引#4,并且我将数据源更改为只有2个项目,则第4个单元格仍然处于冻结状态。 (前2个渲染正确,第3个是空白,第4个是违规单元格)

所有练习列表:

https://dl.dropbox.com/u/2795448/Screenshots/ot.png

当我更改tableView数据源中的数据时,该单元格仍然被冻结:

https://dl.dropbox.com/u/2795448/Screenshots/ou.png

如果我放置一个断点并检查tableView,它没有说明该冻结的单元格:

https://dl.dropbox.com/u/2795448/Screenshots/ov.png

不知道从哪里开始:(似乎只有当我从另一个viewController插入一行然后弹回到这一行时才会发生。

有什么想法?非常感谢所以以获得任何帮助!

2 个答案:

答案 0 :(得分:1)

您正在保留对单元格的引用。这是个坏主意。它与表格单元的数据源和回收的整个模式相矛盾。各种古怪的错误将是不可避免的结果。

相反,您应确保数据源方法返回正确数量的部分和行以及相应的单元格,然后重新加载表格而不是单元格。

[self.tableView reloadData]; 

因此,例如,当视图从添加新项目返回时,请确保您正在使用的数据阵列已更新并重新加载。

答案 1 :(得分:1)

我完全不理解你管理tableview和数据源的方式。如果您对数据源进行任何更改,则同样的更改也应反映在tableview中。 (两者都应该同步)。您可以使用:

Table reloadRowsAtIndexPaths: Table deleteRowsAtIndexPaths: Table insertRowsAtIndexPaths:

更改您的tableview及其单元格。或者您可以致电[Table reloadData]

请记住:永远不要试图存储UITableViewCells的引用,因为它们会在屏幕上再次出现 - 您的引用将只是一个垃圾。只需使用上述3种方法改变细胞,就可以了。如果你想要清除某些东西,只需要它。