【发布时间】:2011-10-29 12:46:42
【问题描述】:
在我的表格视图中,我将子视图添加到某个单元格中。如果单元格的数量大于一个屏幕的高度,例如屏幕可以包含 10 个单元格,如果滚动到 11 个单元格,第一个单元格将消失。返回顶部时,第一个单元格会显示,但即使没有单元格,也会显示子视图。
是因为子视图浮动吗?
【问题讨论】:
标签: iphone uitableview
在我的表格视图中,我将子视图添加到某个单元格中。如果单元格的数量大于一个屏幕的高度,例如屏幕可以包含 10 个单元格,如果滚动到 11 个单元格,第一个单元格将消失。返回顶部时,第一个单元格会显示,但即使没有单元格,也会显示子视图。
是因为子视图浮动吗?
【问题讨论】:
标签: iphone uitableview
这是因为单元被重复使用,以节省内存。当您滚动表格视图时,它将重用被推离屏幕的相同单元格。如果其中一些包含子视图,则子视图也可能被重用并显示在错误的位置。
如果要将子视图添加到单元格的 contentView,请务必标记(UIView 中的 tag 属性)视图并使用 [cell.contentView viewWithTag:YOUR_TAG_ID] 获取它们,然后对它们做任何你想做的事情(即删除子视图,如果它不应该在你的新单元格中)。
示例(在某些单元格中添加了UITextField):
// try to get the text field from the cell
textField = (UITextField*)[cell.contentView viewWithTag:kTABLE_CELL_TAG_TEXTFIELD];
if (textField) {
// remove it if it already exists
[textField removeFromSuperview];
}
【讨论】:
为避免这种行为,您可以在添加新的子视图之前删除单元格的所有视图。
for (UIView *view in cell.contentView.subviews)
{
[view removeFromSuperview];
}
【讨论】:
通过为每个单元格设置唯一的reuseIdentifier来修复,以便tableview不能重用单元格。我的表格视图应该在 100 行,所以看起来不错。
【讨论】:
UITableView 缓存的目的。如果您的单元格非常不同(在布局等方面),则可以使用不同的单元格标识符。但我看不出你需要 100 个唯一的单元格标识符。如果你这样做了,你可能应该重新考虑你的设计......