Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中以编程方式向stackview添加视图_Ios_Swift - Fatal编程技术网

Ios 在Swift中以编程方式向stackview添加视图

Ios 在Swift中以编程方式向stackview添加视图,ios,swift,Ios,Swift,我有一个水平堆栈视图,它占据了整个屏幕的宽度,并包含3个垂直堆栈视图,当控制器加载时这些视图是空的。 水平路线的填充和分布设置为等间距,垂直路线的左、中、右和分布填充设置为等间距。 当用户稍后导航回该场景时,我可能希望填充这些堆栈视图。因此,我覆盖了视图将出现,在视图内部,我做了如下操作: DispatchQueue.global(qos: .userInitiated).async { // here i need to load the data for the labels

我有一个水平堆栈视图,它占据了整个屏幕的宽度,并包含3个垂直堆栈视图,当控制器加载时这些视图是空的。 水平路线的填充和分布设置为等间距,垂直路线的左、中、右和分布填充设置为等间距。 当用户稍后导航回该场景时,我可能希望填充这些堆栈视图。因此,我覆盖了
视图将出现
,在视图内部,我做了如下操作:

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)
    }
}
现在,我只看到第三个堆栈视图的按钮。即使我多次这样做,我也只看到第一个按钮。我认为这是因为StackView一开始是空的,它们的大小没有得到更新。我是否必须调用任何函数,以便它重新创建所有视图?(但使用新的子视图)

编辑: 我找到了一个解决方法:我在故事板中的3个堆栈视图中分别添加一些标签,并在代码中再次删除它们。它可以工作,但我认为这不是一个好的解决方案,如果我需要再次删除标签,StackView不会变小。一定有更好的办法

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
}
根据需要调用
setupsubview
方法。
我希望,这个解决方案对你有帮助

你做错了。StackView本质上是可视数组,可以填充任何您想要的内容。您必须创建项目数组并将这些项目加载到StackView中。我正在写一个答案,所以我需要一些时间来完成它。