【问题标题】:contentView subview keep on screencontentView 子视图保持在屏幕上
【发布时间】:2011-10-29 12:46:42
【问题描述】:

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

是因为子视图浮动吗?

【问题讨论】:

    标签: iphone uitableview


    【解决方案1】:

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

    如果要将子视图添加到单元格的 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];
    }
    

    【讨论】:

    • 谢谢,我尝试在 viewWillAppear 中删除它。但滚动动作不会调用 viewWillAppear。并且在滚动事件方法中清理和重绘子视图看起来不太好。
    • 最好的方法是在tableView:cellForRowAtIndexPath 中移除它,然后再返回重用的单元格。如果您在滚动时遇到延迟(即,如果子视图很重或者如果您有多个子视图),您最好在子类 UITableViewCell' -drawRect: 中绘制内容。查看此问题以获取有关如何操作的更多信息:stackoverflow.com/questions/1106658/…
    • 无论如何,再次感谢。它看起来系统只缓存具有相同reuseIdentifier的单元格。我的代码只包含有限的单元格,所以删除或重绘看起来仍然很复杂。
    【解决方案2】:

    为避免这种行为,您可以在添加新的子视图之前删除单元格的所有视图。

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

    【讨论】:

    • 是的,这也可以,但不能像标记视图那样提供对内容的控制。猜猜这是你有多少控制狂的问题...... :)
    【解决方案3】:

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

    【讨论】:

    • 尽管这可能适用于您的情况,但我真的不建议您这样做。这将导致应用程序消耗比实际需要更多的内存,这可能会导致其他地方出现意外问题。它破坏了UITableView 缓存的目的。如果您的单元格非常不同(在布局等方面),则可以使用不同的单元格标识符。但我看不出你需要 100 个唯一的单元格标识符。如果你这样做了,你可能应该重新考虑你的设计......
    • 其实这个表是自定义的NSUserdefaults,有些项目使用相同的视图结构。对于这些项目,我使用一个重用标识符。 else 项是固定的,所以我可以使用另一个重用标识符。我知道您的想法很好,但我的要求足以使用上述解决方案。抱歉,上面的解决方案看起来不清楚..
    猜你喜欢
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多