【问题标题】:How to use a variable UIStackView in UITableView or UICollectionView?如何在 UITableView 或 UICollectionView 中使用变量 UIStackView?
【发布时间】:2018-02-23 17:38:38
【问题描述】:

我目前正在使用 UICollectionView 构建通用表单构建器。

每个表单元素都是一个单元格,对于复选框,我在单元格内使用 UIStackView 来显示所有可用选项。

问题是每次我重用单元格时,即使我删除了所有的排列子视图,它们也会与新的视图一起留在视图中。

以下代码是我正在做的简化版本:

class cell: UICollectionViewCell {

    @IBOutlet weak var stackView: UIStackView!

    func setup(options: [String]) {

        for option in options {
            let label = UILabel()
            label.text = option
            stackView.addArrangedSubview(label)
        }

    }

    override func prepareForReuse() {
        super.prepareForReuse()
        optionsStackView.arrangedSubviews.forEach({ optionsStackView.removeArrangedSubview(view: $0) })
    }

}

与此相反,我当前的解决方法是在 prepareForReuse() 中隐藏()每个排列的子视图,而不是删除它们,但我不喜欢这样。

【问题讨论】:

    标签: ios swift tableview collectionview stackview


    【解决方案1】:

    如果您阅读有关 removeArrangedSubview 方法的 Xcode 文档,他们会说:

    讨论:此方法将提供的视图从堆栈的 排列的子视图数组。视图的位置和大小将不再是 由堆栈视图管理。但是,此方法不会删除 从堆栈的子视图数组中提供视图;因此,观点是 仍然显示为视图层次结构的一部分。

    为了防止视图在调用堆栈后出现在屏幕上 removeArrangedSubview: 方法,显式地从 通过调用视图的 removeFromSuperview() 方法创建子视图数组,或者 将视图的 isHidden 属性设置为 true。

    因此,您还需要从堆栈视图中删除子视图。 (当我第一次开始使用堆栈视图时,我也遇到了这个问题。)

    编辑:

    事实上,正如@kid_x 指出的那样,只需使用removeFromSuperView() 删除子视图即可。我不确定removeArrangedSubview() 的意义是什么,TBH。


    编辑#2:

    我建议不要使用removeArrangedSubview()。相反,请执行以下操作之一:

    选项 1: 如果您需要从堆栈视图中永久删除视图,只需使用removeFromSuperView()

    选项 2: 如果您想从堆栈视图中删除视图,然后再将它们放回去,只需切换子视图的 isHidden 属性,如 surandr 的回答中所述。堆栈视图将关闭空白空间并重新定位剩余的视图,就像您删除它们一样。

    【讨论】:

    【解决方案2】:

    在许多情况下,由于从可重用视图中的超级视图中删除可能(并且大多数情况下)会导致视图被释放,因此在 UIStackView 中只需将

    dynamicView.isHidden = false
    

    删除和

    dynamicView.isHidden = true
    

    再次添加,将导致堆栈视图重新排列其他排列的视图。

    【讨论】:

      猜你喜欢
      • 2015-12-28
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      相关资源
      最近更新 更多