我在班级UIView
中继承了MyView
。我创建了附加到子类的IBOutlet
。在调用setup()
方法从init()
进行某些设置时,我发现这些出口尚未初始化,因此nil
。
我尝试覆盖layoutSubviews()
,但是正如我所读到的那样,layoutSubviews()
在每次添加新视图后都被称为 ,因此这似乎不是最佳做法
我提出了这个解决方案:分别致电setup()
- 不是在课堂内,而是在viewDidLoad()
ViewController
的{{1}}中。我觉得,工作很不方便。
这是我的代码的简短摘要:
MyView
基本上,问题是来自类,我应该调用class MyView: UIView {
@IBOutlet weak var button: UIButton!
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func setup() {
if button == nil { print("nil") } //prints "nil"
}
}
方法。
答案 0 :(得分:4)
您的设置需要进入awakeFromNib
而不是init
override func awakeFromNib() {
super.awakeFromNib()
// Your setup here
setup()
}
从nib加载视图后,在连接所有插座等之后调用 awakeFromNib
。创建视图后会调用init(coder:)
,但尚未创建/连接其余视图。
但是,使用init(frame:)
创建视图意味着awakeFromNib
未被调用(显然确实 - 在这种情况下没有笔尖!)所以你可能还需要在其中放置一些设置代码 - 完全取决于您的用例。