gpt4 book ai didi

ios - 在 Swift 中以编程方式将 View 添加到 stackview

转载 作者:行者123 更新时间:2023-11-30 11:13:50 24 4
gpt4 key购买 nike

我有一个水平 Stack View,它填充了屏幕的整个宽度,并包含 3 个垂直 StackView,在加载 Controller 时这些 View 是空的。水平方向的对齐设置为填充,分布为等间距,垂直方向的对齐方式为左对齐、居中对齐、右对齐,且分布填充均匀。当用户稍后导航回该场景时,我可能想要填充这些 StackView。因此,我覆盖了 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)
}
}

现在,我只看到第三个堆栈 View 的按钮。即使我多次执行此操作,我也只能看到第一个按钮。我认为这是因为堆栈 View 一开始是空的并且它们的大小没有更新。我是否必须调用任何函数才能重新创建所有 View ? (但使用新的 subview )

编辑:我找到了一个解决方法:我向 Storyboard 中的 3 个堆栈 View 中的每一个添加一些标签,然后在代码中再次将其删除。它有效,但我认为这不是一个很好的解决方案,如果我需要再次删除标签,堆栈 View 不会变小。一定有更好的方法。

最佳答案

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方法。我希望解决方案对您有帮助。

关于ios - 在 Swift 中以编程方式将 View 添加到 stackview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51926895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com