Swift - 以编程方式将标签添加到堆栈视图
Swift - Adding labels to stack views programmatically
我的目标是将标签添加到 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
}
}
最后,这里是将标签添加到堆栈视图的 class。它已大大简化。
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()
,然后您将标签添加到它的 stackView,然后您到达函数的末尾并且 containerView
被 deinit
ed,因为您没有保留它或将它添加为子视图。
您对 ContainerView 的初始化也是错误的。如果你调用 init 它不会加载 nib 文件。您应该改为调用 UINib.instantiate(withOwner:options:)
并将您的设置代码移动到 awakeFromNib
和 fatalError the constructors
这样就没有人会尝试以编程方式制作 nib 并绕过 nib 文件(在这种情况下,插座不会已连接)。
let containerView = UINib(nibName: String(describing: ContainerView.self), bundle: nil)
.instantiate(withOwner: nil, options: nil).first as! ContainerView
我的目标是将标签添加到 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
}
}
最后,这里是将标签添加到堆栈视图的 class。它已大大简化。
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()
,然后您将标签添加到它的 stackView,然后您到达函数的末尾并且 containerView
被 deinit
ed,因为您没有保留它或将它添加为子视图。
您对 ContainerView 的初始化也是错误的。如果你调用 init 它不会加载 nib 文件。您应该改为调用 UINib.instantiate(withOwner:options:)
并将您的设置代码移动到 awakeFromNib
和 fatalError the constructors
这样就没有人会尝试以编程方式制作 nib 并绕过 nib 文件(在这种情况下,插座不会已连接)。
let containerView = UINib(nibName: String(describing: ContainerView.self), bundle: nil)
.instantiate(withOwner: nil, options: nil).first as! ContainerView