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