我有一个水平的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不会变小。必须有更好的方法
答案 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
方法。
希望对您有帮助的解决方案。