在运行时重用具有动态布局内容的单元格

时间:2017-04-10 23:13:49

标签: ios swift uitableview autolayout

我有一种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布局,并且只有内容发生变化吗?我不应该使用重用这些类型的细胞吗?或者之前有人经历过这个?

由于

2 个答案:

答案 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() }