在设置UI时,在`init`中迅速看似奇怪的行为

时间:2017-06-24 23:40:14

标签: ios swift

在我的required init继承类的UIView中,我正在尝试初始化成员变量,然后使用成员变量(即文本)中的数据设置视图的子视图。考虑以下伪代码,它使用变量的数据成功加载UI:

class Event {
    var title: String?
}

class A: UIView {

    let event: Event! {
        didSet {
            self.title_label.text = event.title
        }
    }

    required init(event: Event) {
        super.init(frame: CGRect(...))
        self.setupUI(with: event)
    }

    func setupUI(with event: Event) {
        self.event = event
        self.addSubview(title_label)
        self.constrainTitleLabel()
    }

    let title_label: UILabel = {
        let label = UILabel()
        ...
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    ...
}

但是,如果我将event的初始化从函数移动到init,则UI不再显示变量的数据:

class A: UIView {

    let event: Event! {
        didSet {
            self.title_label.text = event.title
        }
    }

    required init(event: Event) {
        super.init(frame: CGRect(...))
        self.event = event
        self.setupUI(with: event)
    }

    func setupUI(with event: Event) {
        self.addSubview(title_label)
        self.constrainTitleLabel()
    }

    let title_label: UILabel = {
        let label = UILabel()
        ...
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    ...
}

为什么第二种方式不能正确设置title_label.text?我很确定这与我自己的代码足够接近,但是如果这个代码实际上没有问题那么我就错过了我已经做过的事情。感谢。

1 个答案:

答案 0 :(得分:0)

didSet观察员不会调用init设置的值。

  

在调用超类初始值设定项之后,在子类初始值设定项中设置属性时,将调用超类属性的willSet和didSet观察者。在调用超类初始值设定项之前,类在设置自己的属性时不会调用它们。

(来自Properties)。

不幸的是,文档并不完全正确。请参阅错误SR-1118。从init设置值时,永远不会调用观察者。