从垂直堆栈视图中删除视图

Removing views from vertical stackview

一如既往的菜鸟问题。

我有 ViewController,其中包含垂直堆栈视图。堆栈内部是标签和文本字段(标签描述了要输入到文本字段中的文本)。根据用户从前一屏幕的 table 中的项目列表中选择的内容,我想更改向用户显示哪些标签+文本字段。

为简单起见,我想一次删除这两个。我已经能够使用标签从视图中删除文本字段+标签。但是我不能将相同的标签号分配给标签和文本字段,然后将它们同时从视图中删除。当前一次删除标签和文本字段看起来像...

    if let viewWithTag = self.view.viewWithTag(1) {
        viewWithTag.removeFromSuperview()
    }
    if let viewWithTag = self.view.viewWithTag(2) {
        viewWithTag.removeFromSuperview()
    }

有很多标签+文本字段来解决这个问题可能会变得混乱。

接下来我查看了将 UIView 插入堆栈,然后将我的标签+文本字段添加到该视图中。然后我可以为 UIView 分配一个标签并一次删除所有标签,但是垂直堆栈视图内的 uiviews 对齐是一团糟,我真的不知道如何修复它。似乎不是正确的方法?

想知道我是否需要将标签编号粘贴到某种数组中并创建一个函数来简化带有标签的删除过程?

任何关于如何接近的帮助表示赞赏。

可能使用 UIView 扩展?

extension UIView {
  func remove(_ tag:Int) {
     if let parent = self.viewWithTag(tag) {
        parent.removeFromSuperview()
     }
   }
}

然后使用:

self.view.remove(1)

UIStackView 中的视图已经是索引数组,可通过堆栈视图的 .arrangedSubviews 属性.

访问

所以,假设您有 8 个 label/field 对,它们将像这样被索引:

如果要删除第 4 对(标签 4 和字段 4),您可以这样做:

stackView.arrangedSubviews[6].removeFromSuperview()

删除“标签 4”(记住,数组索引是从零开始的)。

现在,“Field 4”位于 [6],所以请再次调用它:

stackView.arrangedSubviews[6].removeFromSuperview()

也就是说,根据您的操作,您可能会发现 ADD 您的 label/field 对更容易在运行时。

大致如下:

    let labels: [String] = [
        "First name",
        "Last name",
        "Age",
        "Favorite color",
        "Favorite food",
        "Favorite animal",
    ]
    
    // based on selection from previous view controller,
    //  let's show First name, Last name, Fav color and animal
    let pairsToShow: [Int] = [0, 1, 3, 5]
    
    pairsToShow.forEach { idx in
        let v = UILabel()
        v.text = labels[idx]
        v.backgroundColor = .yellow
        stackView.addArrangedSubview(v)
        let t = UITextField()
        t.borderStyle = .roundedRect
        stackView.addArrangedSubview(t)
    }

我们最终得到这个: