Swift - 以编程方式向堆栈视图添加标签

Posted

技术标签:

【中文标题】Swift - 以编程方式向堆栈视图添加标签【英文标题】:Swift - Adding labels to stack views programmatically 【发布时间】:2019-12-13 20:47:18 【问题描述】:

我的目标是将标签添加到 xib 中的堆栈视图。如果使用视图控制器显示结果,下面的一切都很好。但我不需要显示我正在创建的视图。我只想将它添加到数组中。 (该数组稍后将转换为 PDF。)出于某种原因,如果我只是保存视图,则在创建 PDF 时不会出现堆栈视图中的任何内容。我实际的 xib 有许多其他字段显示得很好。只有我尝试以编程方式将标签作为标签添加到堆栈视图的字段才会出现!

这是我的 xib。堆栈视图固定在边缘,并设置为平均填充。

这是 xib 的代码。视图有一个出口,堆栈视图有一个出口。

import UIKit

class ContainerView: UIView 

    @IBOutlet var contentView: UIView!
    @IBOutlet weak var testStackView: UIStackView!

    override init(frame: CGRect) 
        super.init(frame: frame)
        setup()
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        setup()
    

    func setup() 
        Bundle.main.loadNibNamed("ContainerView", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
    

最后,这是向堆栈视图添加标签的类。它已大大简化。

import UIKit

class PreparePDF : UIView 

    func addMyArrangedSubviews (
        let containerView = ContainerView()

        let testLabel1 = UILabel()
        testLabel1.text = "Hola"
        testLabel1.backgroundColor = .red

        let testLabel2 = UILabel()
        testLabel2.text = "Hello"
        testLabel2.backgroundColor = .yellow

        containerView.testStackView.addArrangedSubview(testLabel1)
        containerView.testStackView.addArrangedSubview(testLabel2)  

        pdfPages.append(containerView)

我曾多次尝试问过这个问题,但我觉得这听起来太复杂了。我不确定这是否更好!

【问题讨论】:

您对loadNibNamed 的调用没有返回任何内容。来自文档:“您应该手动保留返回的数组或其包含的对象,以防止 nib 文件对象过早释放。” 好吧...假设这就是问题所在。 (这会很棒!)我仍然不清楚要改变什么。即使我保存了返回的数组,我会用它做什么?谢谢! 【参考方案1】:

您正在创建一个视图:let containerView = ContainerView(),然后您将标签添加到它的 stackView,然后您到达函数的末尾,containerViewdeinited,因为您没有保留它或将其添加为一个子视图。

您对 ContainerView 的初始化也是错误的。如果你调用 init 它不会加载 nib 文件。您应该改为调用UINib.instantiate(withOwner:options:) 并将您的设置代码移动到awakeFromNibfatalError the constructors,这样没有人会尝试以编程方式制作笔尖并绕过笔尖文件(在这种情况下,插座将不会连接)。

let containerView = UINib(nibName: String(describing: ContainerView.self), bundle: nil)
      .instantiate(withOwner: nil, options: nil).first as! ContainerView

【讨论】:

我在保存视图的位置添加了代码行——它只是放在一个数组中。但是你答案的后半部分很有趣。我写的代码运行良好。加载了 nib 文件,我可以访问它的出口。我只是无法以编程方式添加任何内容。所以我接受了你的建议,然后能够从代码中添加标签。有点儿。但这是另一个问题的主题。谢谢!

以上是关于Swift - 以编程方式向堆栈视图添加标签的主要内容,如果未能解决你的问题,请参考以下文章

无法以编程方式在 Swift 的堆栈视图中正确排列两个标签

Swift 3:不能以编程方式在 Collectionview 标题上正确创建标签?

Swift - StackView 和添加约束,以编程方式添加视图到堆栈 - 加载后调整单元格高度?

使用 xamarin.ios c# 以编程方式添加嵌套的堆栈视图

iOS Swift标签栏控制器以编程方式添加项目(新标签)

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