Saya membuat init umum untuk yang ditunjuk dan diperlukan. Untuk kemudahan saya mendelegasikan init(frame:)
dengan bingkai nol.
Memiliki nol frame bukanlah masalah karena biasanya view berada di dalam viewController's view; tampilan ubahsuaian Anda akan mendapatkan kesempatan yang baik dan aman untuk mengatur tampilan bawahnya saat panggilan superview layoutSubviews()
atau updateConstraints()
. Dua fungsi ini dipanggil oleh sistem secara rekursif di seluruh hierarki tampilan. Anda dapat menggunakan salah satu updateContstraints()
atau layoutSubviews()
. updateContstraints()
disebut pertama, lalu layoutSubviews()
. Dalam updateConstraints()
make pastikan untuk panggilan super lalu . Di layoutSubviews()
, panggil super dulu .
Inilah yang saya lakukan:
@IBDesignable
class MyView: UIView {
convenience init(args: Whatever) {
self.init(frame: CGRect.zero)
//assign custom vars
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
commonInit()
}
private func commonInit() {
//custom initialization
}
override func updateConstraints() {
//set subview constraints here
super.updateConstraints()
}
override func layoutSubviews() {
super.layoutSubviews()
//manually set subview frames here
}
}
var
. Tetapi praktik terbaik default di Swift adalah mendeklarasikan variabellet
kecuali ada alasan untuk mendeklarasikannyavar
. Karena itu, tidak ada alasan untuk melakukannya dalam contoh kode saya di ataslet
.init(coder:)
.s
dani
Opsional untuk menjaga hal-hal sederhana di sini. Jika mereka bukan opsional, mereka juga perlu diinisialisasi dalam initializer yang diperlukan. Menjadikannya opsional berarti menjadi sepertinil
saatsuper.init()
dipanggil. Jika mereka bukan opsional, mereka memang perlu ditugaskan sebelum memanggil super.init ().