迅速:以编程方式将视图添加到stackview

时间:2018-08-20 08:35:00

标签: ios swift

我有一个水平的Stack View,它填充了屏幕的整个宽度,并包含3个垂直的StackView,在加载控制器时为空。 水平方向的对齐方式设置为填充并分配相等的间距,垂直方向的对齐方式设置为左对齐,中心对齐,右对齐和分布对齐。 当用户稍后导航回到该场景时,我可能想填充这些StackViews。因此,我已经覆盖了viewWillAppear,并且在内部执行了以下操作:

DispatchQueue.global(qos: .userInitiated).async {
    // here i need to load the data for the labels
    DispatchQueue.main.async {
        var label = UILabel()
        label.text = //...
        self.firstStackView.addArrangedSubview(label)
        label = UILabel()
        label.text = //...
        self.secondStackView.addArrangedSubview(label)
        var btn = UIButton()
        btn.setTitle("X", for: .normal)
        btn.addTarget(//...)
        self.thirdStackView.addArrangedSubview(btn)
    }
}

现在,我只看到“第三堆栈视图”的按钮。即使我多次这样做,我也只会看到第一个按钮。我认为它的bc stackviews首先是空的,并且它们的大小不会更新。我必须调用任何函数,以便它重新创建所有视图吗?(但带有新的子视图)

编辑: 我找到了一种解决方法:我向情节提要中的3个堆栈视图分别添加了一些标签,然后在代码中再次将其删除。它有效,但我认为这不是一个很好的解决方案,如果我需要再次删除标签,则stackviews不会变小。必须有更好的方法

1 个答案:

答案 0 :(得分:0)

private var lbl1: UILabel!
private var lbl2: UILabel!
private var horizontalStackView: UIStackView!

private let setupLabelBlock = { () -> UILabel in
    let label = UILabel()
    label.textColor = .white
    label.setFontSize(16)
    label.textAlignment = .center
    return label
}

private func setupSubviews() {
    setupLabels()
    setupHorizontalStackView()
}

private func setupLabels() {
    lbl1 = setupLabelBlock()
    lbl2 = setupLabelBlock()
}

private func setupHorizontalStackView() {
    horizontalStackView = UIStackView(arrangedSubviews: [lbl1, lbl2])
    horizontalStackView.axis = .horizontal
    horizontalStackView.alignment = .fill
    horizontalStackView.distribution = .fill
    horizontalStackView.spacing = 2
}

根据要求调用setupSubviews方法。 希望对您有帮助的解决方案。