首页 > 解决方案 > 从垂直堆栈视图中删除视图

问题描述

菜鸟问题一如既往。

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

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

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

使用相当多的标签+文本字段来解决这个问题可能会变得混乱。

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

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

任何有关如何处理的帮助表示赞赏。

标签: iosswiftuiviewuistackviewremovefromsuperview

解决方案


a 中的视图UIStackView已经是一个索引数组,可以通过堆栈视图的.arrangedSubviews属性访问。

因此,假设您有 8 个标签/字段对,它们将被索引如下:

在此处输入图像描述

如果要删除第 4 对(标签 4 和字段 4),可以执行以下操作:

stackView.arrangedSubviews[6].removeFromSuperview()

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

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

stackView.arrangedSubviews[6].removeFromSuperview()

也就是说,根据您的操作,您可能会发现在运行时添加标签/字段对更容易。

这些方面的东西:

    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)
    }

我们最终得到了这个:

在此处输入图像描述


推荐阅读