在运行时重用具有动态布局内容的单元格
Posted
技术标签:
【中文标题】在运行时重用具有动态布局内容的单元格【英文标题】:Reusing cells with dynamic layout content at runtime 【发布时间】:2017-04-10 23:13:48 【问题描述】:我有一种 UITableViewCell,它允许用户在运行时添加/删除任意数量的 UITextView。
我在尝试重用/出列该类型的单元格时遇到了问题,因为有时表格视图单元格会在您上下滚动时开始重叠。当我出列/返回单元格时,我正在运行一个设置方法(它首先在内部启动一个拆卸方法以删除所有以前的视图),并使用模型来设置/恢复所有必要的视图和布局约束。
if let cell = tableView.dequeueReusableCell(withIdentifier: "MultipleContentCell", for: indexPath) as? MultipleChoiceTableViewCell
cell.setupCellWithModel(model: model)
cell.setNeedsUpdateConstraints()
cell.updateConstraintsIfNeeded()
cell.delegate = self
return cell
我真的不明白为什么这些单元格有时会在表格视图中重叠,但我猜这与动态重新创建的布局有关。我正在考虑不重用这些类型的单元格,而只是将它们存储在一个列表中。
我的问题是:可重复使用的单元格是否总是假设具有相同的一般 UIView 布局,只有内容发生变化?我不应该重复使用这些类型的单元格吗?或者以前有人经历过吗?
谢谢
【问题讨论】:
【参考方案1】:UITextView 是在您每次将单元格出列并且永远不会删除时创建的。修复该使用函数prepareForReuse()。您必须定义在 MultipleChoiceTableViewCell 中出列之前您的单元格应该做什么。例如:
override func prepareForReuse()
super.prepareForReuse()
for view in speciesName.subviews
if view is UITableView
view.removeFromSuperview()
几天前我添加了类似的问题:
Cells in UITableView overlapping. Many cells in one place
如果您有任何问题,我明天可以尝试为您提供更多帮助。 干杯!
【讨论】:
【参考方案2】:一般来说,是的。您希望单元格的物理布局是静态的,并且仅在回收它们时改变内容。如果您将视图添加到 cellForRow(at:)
中的单元格,那么您就有责任管理额外的字段以避免重复视图。
您根据用户交互将可变数量的视图添加到表格视图单元格的情况是一种奇怪的情况,您可能需要即时添加和删除单元格。
处理这个问题的一种方法是将所有文本字段放在容器视图中,向该容器视图添加一个出口,然后在 prepareForReuse 或 cellForRowAt 函数中简单地使用类似这样的代码:
containerView.subviews.forEach $0.removeFromSuperview()
【讨论】:
以上是关于在运行时重用具有动态布局内容的单元格的主要内容,如果未能解决你的问题,请参考以下文章
滚动时 UITableViewCell 自动布局抖动的动态单元格高度问题
具有动态内容、动态布局和动态高度的 UITableViewCell