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

Swift-以编程方式向堆栈视图添加标签,swift,xib,uistackview,Swift,Xib,Uistackview,我的目标是向xib中的stackview添加标签。如果使用视图控制器显示结果,则下面的所有内容都非常有用。但是我不需要显示我正在创建的视图。我只想将它添加到数组中。(数组稍后将转换为PDF。)出于某种原因,如果我只保存视图,则在创建PDF时,堆栈视图中的任何内容都不会显示。我的实际xib有许多其他字段显示得很好。只有我尝试以编程方式添加为标签的字段无法显示到堆栈视图中 这是我的xib。堆栈视图固定到边上,并设置为均匀填充。 这是xib的代码。视图和堆栈视图各有一个出口 import UIKit

我的目标是向xib中的stackview添加标签。如果使用视图控制器显示结果,则下面的所有内容都非常有用。但是我不需要显示我正在创建的视图。我只想将它添加到数组中。(数组稍后将转换为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)
}

我已经试着问了好几次这个问题,但我觉得我把它说得太复杂了。我不确定这是否更好

创建视图时使用:
let containerView=containerView()
,然后将标签添加到其堆栈视图,然后点击函数的末尾,
containerView
deinit
ed,因为您没有保留它或将它添加为子视图

您对ContainerView的初始化也是错误的。如果调用init,它将不会加载nib文件。您应该调用
UINib.instantiate(withOwner:options:)
,然后将设置代码移动到
awakeFromNib
fatalError构造函数
,这样就不会有人试图以编程方式创建nib并绕过nib文件(在这种情况下,插座将无法连接)


您对
loadNibNamed
的调用没有返回任何内容。在文档中:“您应该手动保留返回的数组或其中包含的对象,以防止nib文件对象过早释放。”好吧……假设这就是问题所在。(那太好了!)我仍然不清楚该改变什么。即使我保存了返回的数组,我将如何处理它?谢谢我在保存视图的地方添加了一行代码——它只是放在一个数组中。但你的回答的后半部分很有趣。我写的代码运行良好。nib文件已加载,我可以访问它的出口。我就是不能按程序添加任何内容。所以我接受了您的建议,然后能够从代码中添加标签。有点但这是另一个问题的主题。谢谢
let containerView = UINib(nibName: String(describing: ContainerView.self), bundle: nil)
      .instantiate(withOwner: nil, options: nil).first as! ContainerView