在 Swift 中以编程方式将视图添加到 stackview

Posted

技术标签:

【中文标题】在 Swift 中以编程方式将视图添加到 stackview【英文标题】:Add views to stackview programmatically in Swift 【发布时间】:2018-08-20 08:34:59 【问题描述】:

我有一个水平堆栈视图,它填充了屏幕的整个宽度并包含 3 个垂直堆栈视图,当控制器加载时它们是空的。 水平的对齐设置为填充和分布到相等的间距,垂直的对齐左,中,右和分布填充相等。 当用户稍后导航回这个场景时,我可能想要填充这些 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)
    

现在,我只看到第三个堆栈视图的按钮。即使我多次这样做,我也只会看到第一个按钮。我认为这是因为堆栈视图起初是空的,并且它们的大小没有更新。我是否必须调用任何函数才能重新创建所有视图? (但有新的子视图)

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

【问题讨论】:

你做错了。 StackViews 本质上是可视数组,可以填充任何你想要的东西。您必须创建一个项目数组并将这些项目加载到 StackView 中。我正在写一个答案,所以我需要一些时间来完成它。 【参考方案1】:
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方法。 我希望,解决方案对您有所帮助。

【讨论】:

以上是关于在 Swift 中以编程方式将视图添加到 stackview的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 中以编程方式在堆栈视图中添加标签和文本视图

当 iAd 横幅出现时,如何将视图的内容上移? (在 Swift 中以编程方式)

如何在 Swift 4 中以编程方式将 IBAction 添加到按钮?

如何在 ios swift 中以编程方式将情节提要视图控制器加载到标签栏控制器中?

在 Swift 4 中以编程方式将 UIImageView、UILabel 添加到 UIStackView

在 iOS Swift 3 中以编程方式添加 Web 视图时如何在 UIWebView 中获取响应状态代码?