在设置UI时,Swift在“ Init”中看似奇怪的行为

  • 本文关键字:UI 设置 Swift Init ios swift
  • 更新时间 :
  • 英文 :


在我的UIView继承类的required init中,我正在尝试初始化成员变量,然后使用来自成员变量的数据(即文本(设置视图的子视图。考虑以下伪代码成功加载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?我很确定这足够接近我自己的代码,但是如果此代码实际上没有问题,那么我错过了我所做的事情。谢谢。

didSet观察者未调用init设置的值。

在调用超类初始化器之后,当属性设置为子类初始化器中时,将调用超类属性的材料和DIDSET观察者。在称为超类初始化器之前,当一堂课设置自己的属性时,他们没有被调用。

(来自属性(。

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

最新更新