如何调用 IBOutlet 元素的初始值设定项?

How do you call an IBOutlet element's initializer?

我写了 UITextField 的以下子class:


    var imageView: UIButton? = nil

    var options: [String]? = nil

    let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 30)

    override init(frame: CGRect) {
        super.init(frame:frame)
        self.backgroundColor = Constants.darkPurple
        self.textColor = .white
        self.layer.cornerRadius = 10
        self.clipsToBounds = true
        self.translatesAutoresizingMaskIntoConstraints = false
        self.tintColor = .clear

        Constants.styleDropDownField(self)
    }



    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        //fatalError("init(coder:) has not been implemented")
    }
}

当我以编程方式添加此 class 的实例时,它工作正常。但是,当我在故事板中添加 class 的实例,然后将其与 IBAction 连接时,它只是一个空白的白色文本字段,没有我在 class 的初始化程序中分配的任何属性 - 它似乎根本没有调用初始化程序。有什么方法可以调用元素的初始化器吗?或者是否有另一个类似于 viewDidLoad 的函数,它会在加载文本字段时 运行?

您不能调用故事板中添加的组件的初始化程序。但你正朝着正确的方向前进。创建一个通用方法来设置这些属性。

 func commonSetup() {
        self.backgroundColor = Constants.darkPurple
        self.textColor = .white
        self.layer.cornerRadius = 10
        self.clipsToBounds = true
        self.translatesAutoresizingMaskIntoConstraints = false
        self.tintColor = .clear

        Constants.styleDropDownField(self)
    }

并从三种不同的方法中调用此方法

override func awakeFromNib() {
    super.awakeFromNib()
    self.commonSetup()
}

override init(frame: CGRect) {
    super.init(frame:frame)
    self.commonSetup()
}


//This method will be called when component is initialised from storyboard.
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.commonSetup()
}

您必须在 init(coder:) 中调用 init(frame:) 中给出的实现,因为从情节提要中使用时会调用此方法。这是代码:

override init(frame: CGRect) {
    super.init(frame:frame)
    initialSetup()
}



required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    initialSetup()
}

func initialSetup() {
    self.backgroundColor = Constants.darkPurple
    self.textColor = .white
    self.layer.cornerRadius = 10
    self.clipsToBounds = true
    self.translatesAutoresizingMaskIntoConstraints = false
    self.tintColor = .clear

    Constants.styleDropDownField(self)
}