我有一种UITableViewCell类型,允许用户在运行时添加/删除任意数量的UITextView。
我在尝试重用/出列该类型的单元格时遇到问题,因为有时桌面单元格在您向上和向下滚动时才会开始重叠。当我出列/返回单元格时,我正在运行一个设置方法(首先在内部启动拆解方法以删除所有先前的视图),并使用该模型来设置/恢复所有必要的视图和布局约束。 / p>
if let cell = tableView.dequeueReusableCell(withIdentifier: "MultipleContentCell", for: indexPath) as? MultipleChoiceTableViewCell {
cell.setupCellWithModel(model: model)
cell.setNeedsUpdateConstraints()
cell.updateConstraintsIfNeeded()
cell.delegate = self
return cell
}
我无法弄清楚为什么这些单元格有时会在tableview中重叠,但我猜测它与在运行中重新创建的布局有关。我考虑不重复使用这些类型的单元格,只是将它们存储在列表中。
我的问题是:可重用单元格总是假设具有相同的通用UIView布局,并且只有内容发生变化吗?我不应该使用重用这些类型的细胞吗?或者之前有人经历过这个?
由于
答案 0 :(得分:0)
每次出列单元格时都会创建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
如果您有疑问,我可以尝试明天帮助您。 干杯!
答案 1 :(得分:0)
总的来说,是的。您希望单元格的物理布局是静态的,并且只有在回收它们时才会改变内容。如果您在cellForRow(at:)
中向单元格添加视图,那么您需要负担管理额外字段以避免重复视图的负担。
根据用户交互向表视图单元格添加可变数量的视图的情况很奇怪,您可能需要动态添加和删除单元格。
处理此问题的一种方法是将所有文本字段放在容器视图中,向该容器视图添加插座,然后在prepareForReuse或cellForRowAt函数中使用这样的代码:
containerView.subviews.forEach { $0.removeFromSuperview() }