Saya memiliki kelas yang disebut MyClass
subclass UIView
, yang ingin saya inisialisasi dengan XIB
file. Saya tidak yakin bagaimana menginisialisasi kelas ini dengan file xib bernamaView.xib
class MyClass: UIView {
// what should I do here?
//init(coder aDecoder: NSCoder) {} ??
}
Jawaban:
Saya menguji kode ini dan berfungsi dengan baik:
Inisialisasi tampilan dan gunakan seperti di bawah ini:
ATAU
UPDATE Swift> = 3.x & Swift> = 4.x
sumber
var view = MyClass.instanceFromNib()
&self.view.addSubview(view)
sebagai kebalikan darivar view = MyClass.instanceFromNib
&self.view.addSubview(view())
. Hanya saran kecil untuk meningkatkan jawabannya :)Solusi Sam sudah bagus, meskipun tidak memperhitungkan bundel yang berbeda (NSBundle: forClass datang untuk menyelamatkan) dan membutuhkan pemuatan manual, alias mengetik kode.
Jika Anda ingin dukungan penuh untuk Outlet Xib Anda, Bundel yang berbeda (digunakan dalam kerangka kerja!) Dan dapatkan pratinjau yang bagus di Storyboard coba ini:
Gunakan xib Anda seperti biasa, yaitu hubungkan Outlet ke Pemilik File dan setel kelas Pemilik File ke kelas Anda sendiri.
Penggunaan: Cukup subkelas kelas Tampilan Anda sendiri dari NibLoadingView & Atur nama kelas menjadi Pemilik File di file Xib
Tidak diperlukan kode tambahan lagi.
Kredit di mana kredit jatuh tempo: Diperbaiki dengan perubahan kecil dari DenHeadless di GH. My Gist: https://gist.github.com/winkelsdorf/16c481f274134718946328b6e2c9a4d8
sumber
nibSetup
dariinit?(coder:)
akan menyebabkan rekursi tak terbatas jika menanamkanNibLoadingView
dalam XIB..clearColor()
- setelah memuatnya dari Storyboard. Tetapi itu harus bekerja jika Anda melakukannya dengan kode setelah itu dipakai. Bagaimanapun, seperti yang dikatakan pendekatan yang lebih elegan adalah yang berbasis protokol. Jadi yakin, inilah tautan untuk Anda: github.com/AliSoftware/Reusable . Saya menggunakan pendekatan serupa sekarang mengenai UITableViewCells (yang saya implementasikan sebelum saya menemukan proyek yang sangat berguna). hth!Pada Swift 2.0, Anda dapat menambahkan ekstensi protokol. Menurut pendapat saya, ini adalah pendekatan yang lebih baik karena tipe kembalinya
Self
lebih daripadaUIView
, jadi penelepon tidak perlu dilemparkan ke kelas tampilan.sumber
var myView = nib.instantiate... as! myViewType
Swift 3
(XCode 8.0 beta 6) tanpa masalah. Ketik itu diSwift 2
. Mengapa itu harus menjadi jawaban lain ketika jawaban ini bagus dan pengguna mungkin akan suka mencari apa saja perubahan ketika mereka akan menggunakan XC8Dan ini adalah jawaban Frederik on Swift 3.0
sumber
Cara universal memuat tampilan dari xib:
Contoh:
Penerapan:
sumber
Swift 3 Jawab: Dalam kasus saya, saya ingin memiliki outlet di kelas khusus yang dapat saya modifikasi:
Ketika di .xib, pastikan bahwa bidang Kelas Kustom adalah MyClassView. Jangan repot-repot dengan Pemilik File.
Selain itu, pastikan Anda menghubungkan outlet di MyClassView ke label:
Untuk instantiate:
sumber
Cepat 4
Di sini, dalam kasus saya, saya harus meneruskan data ke tampilan kustom itu, jadi saya membuat fungsi statis untuk membuat tampilan.
Buat ekstensi UIView
Buat MyCustomView
Setel kelas khusus ke MyCustomView dalam file .xib. Hubungkan outlet jika perlu seperti biasa.
Tampilan Instantiate
sumber
sumber