Katakanlah saya ingin init
sebuah UIView
subclass dengan String
dan Int
.
Bagaimana saya melakukan ini di Swift jika saya hanya subklasifikasi UIView
? Jika saya hanya membuat init()
fungsi kustom tetapi parameternya adalah String dan Int, ini memberitahu saya bahwa "super.init () tidak dipanggil sebelum kembali dari initializer".
Dan jika saya menelepon super.init()
saya diberitahu saya harus menggunakan inisialisasi yang ditunjuk. Apa yang harus saya gunakan di sana? Versi bingkai? Versi coder? Kedua? Mengapa?
sumber
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 ().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()
atauupdateConstraints()
. Dua fungsi ini dipanggil oleh sistem secara rekursif di seluruh hierarki tampilan. Anda dapat menggunakan salah satuupdateContstraints()
ataulayoutSubviews()
.updateContstraints()
disebut pertama, lalulayoutSubviews()
. DalamupdateConstraints()
make pastikan untuk panggilan super lalu . DilayoutSubviews()
, panggil super dulu .Inilah yang saya lakukan:
sumber
commonInit
metode, tetapi Anda tidak dapat menempatkannya setelahsuper
dalam kasus ini karena Anda harus menginisialisasi semua properti SEBELUMsuper
panggilan. Lol sepertinya loop mati.Inilah cara saya melakukannya di iOS 9 di Swift -
Berikut ini adalah proyek lengkap dengan contoh:
sumber
super.init
, tetapi dia mengatakan itu harus dilakukan sebelumsuper.init
...Inilah cara saya melakukan Subview di iOS di Swift -
sumber