使用IBOutlets正确设置UIView子类

时间:2017-06-26 13:26:44

标签: ios swift subclass

背景

我在班级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" } } 方法。

1 个答案:

答案 0 :(得分:4)

您的设置需要进入awakeFromNib而不是init

override func awakeFromNib() {
    super.awakeFromNib()

    // Your setup here
    setup()
}
从nib加载视图后,在连接所有插座等之后调用

awakeFromNib。创建视图后会调用init(coder:),但尚未创建/连接其余视图。

但是,使用init(frame:)创建视图意味着awakeFromNib 未被调用(显然确实 - 在这种情况下没有笔尖!)所以你可能还需要在其中放置一些设置代码 - 完全取决于您的用例。