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