contentView子视图保持在屏幕上

contentView子视图保持在屏幕上

问题描述:

在我的tableview中,我将子视图添加到某个单元格中。如果单元格的数量大于一个屏幕的高度,例如,屏幕可以包含10个单元格,如果滚动到11个单元格,则第一个单元格将消失。当返回顶部时,即使没有单元格,第一个单元格也会显示子视图。contentView子视图保持在屏幕上

是因为子视图浮动吗?

这是因为单元格正在被重用,以节省内存。当您滚动您的表格视图时,它将重新使用相同的单元格,这些单元格会被推出屏幕。如果其中一些包含子视图,则子视图也可能被重用并显示在错误的地方。

如果要添加子视图细胞的contentView,一定要标记(UIViewtag属性)的意见,并与[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]; 
} 
+0

谢谢,我试图在viewWillAppear删除它。但是滚动操作不会调用viewWillAppear。在滚动事件方法中清理并重绘子视图看起来不太好。 – atu0830

+1

最好的方法是在返回重用单元格之前,将它在tableView:cellForRowAtIndexPath中删除。 如果您在滚动时遇到滞后(即如果子视图很重或者您有多个子视图),则可以更好地在子类UITableViewCell'-drawRect中绘制内容:而不是。看看这个问题的一些更多的信息如何做到这一点:http://*.com/questions/1106658/custom-draw-a-uitableviewcell –

+0

无论如何,再次感谢。它看起来系统只缓存具有相同reuseIdentifier的单元。我的代码只包含有限的单元格,所以删除或重绘仍然看起来很复杂。 – atu0830

要避免这种行为,你可以删除你的所有意见,增加新的子视图之前。

for (UIView *view in cell.contentView.subviews) 
{ 
    [view removeFromSuperview]; 
} 
+0

是的,这也会起作用,但不会像标记视图一样提供对内容的控制。猜猜这是一个控制怪物你是多少... :) –

通过为每个单元设置唯一的reuseIdentifier来修复,以便tableview不能重用单元。我的表格视图应该在100行,所以看起来不错。

+0

即使这可能适用于你的情况,我真的建议反对它。这会导致应用程序消耗比实际需要更多的内存,这可能会导致其他地方出现意想不到的问题。它击败了“UITableView”缓存的目的。 如果你的单元格非常不同(在布局等方面),使用不同的单元格标识符是可以的。但我看不到你需要100个独特的小区标识符。如果你这样做,你应该重新考虑你的设计... –

+0

其实这张表是一个自定义的NSUserdefaults,有些项目使用相同的视图结构。对于那些项目,我使用一个reuseIdentifier。其他项目是固定的,所以我可以使用另一个reuseIdentifier。我知道你的想法很好,但我的要求足以使用上述解决方案。抱歉上面的解决方案看起来不太清楚.. – atu0830