【问题标题】:Removing views from vertical stackview从垂直堆栈视图中删除视图
【发布时间】:2021-10-29 12:40:35
【问题描述】:

菜鸟问题一如既往。

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

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

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

如果要处理很多标签+文本字段,这可能会变得混乱。

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

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

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

【问题讨论】:

    标签: ios swift uiview uistackview removefromsuperview


    【解决方案1】:

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

    我们最终得到了这个:

    【讨论】:

    • 这太棒了,谢谢。没想到将其翻转并添加标签/文本字段而不是删除!也没有意识到堆栈视图是在索引数组中创建的!
    【解决方案2】:

    可能使用 UIView 扩展?

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

    然后使用:

    self.view.remove(1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多