Bagaimana Anda menambahkan penginisialisasi kustom ke UIViewController
subclass di Swift?
Saya telah membuat sub kelas UIViewController
yang terlihat seperti ini:
class MyViewController : UIViewController
{
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
self.leftVC = leftVC;
self.rightVC = rightVC;
self.gap = gap;
super.init();
setupScrollView();
setupViewControllers();
}
}
Ketika saya menjalankannya, saya mendapatkan kesalahan fatal:
kesalahan fatal: penggunaan penginisialisasi yang tidak diterapkan 'init (nibName: bundle :)' untuk kelas 'MyApp.MyViewController'
Saya telah membaca di bagian lain bahwa ketika menambahkan penginisialisasi khusus, kita juga harus menimpanya init(coder aDecoder:NSCoder)
jadi mari kita timpa init
dan lihat apa yang terjadi:
override init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder);
}
Jika saya menambahkan ini, Xcode akan mengeluhkannya self.leftVC is not initialized at super.init call
. Jadi saya rasa itu juga tidak bisa menjadi solusinya. Jadi saya bertanya-tanya bagaimana cara menambahkan penginisialisasi kustom dengan benar ke ViewController
subclass di Swift (karena di Objective-C ini sepertinya tidak menjadi masalah)?
sumber
MyViewController
?Jawaban:
Pecahkan itu! Seseorang harus memanggil penginisialisasi yang ditunjuk yang dalam hal ini adalah init dengan nibName, jelas ...
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int) { self.leftVC = leftVC self.rightVC = rightVC self.gap = gap super.init(nibName: nil, bundle: nil) setupScrollView() setupViewControllers() }
sumber
Untuk UIViewController yang lebih umum, Anda dapat menggunakan ini pada Swift 2.0
init() { super.init(nibName: nil, bundle: nil) }
sumber
Tidak yakin apakah Anda berhasil menyelesaikan ini sepenuhnya ... tetapi tergantung pada bagaimana Anda ingin antarmuka kelas Anda terlihat dan apakah Anda benar-benar membutuhkan fungsionalitas pembuat kode atau tidak, Anda juga dapat menggunakan yang di bawah ini:
convenience required init(coder aDecoder: NSCoder) { //set some defaults for leftVC, rightVC, and gap self.init(leftVC, rightVC, gap) }
Karena
init:leftVC:rightVC:gap
merupakan penginisialisasi yang ditunjuk, Anda dapat memenuhi persyaratan penerapaninit:coder
dengan menjadikannya penginisialisasi praktis yang memanggil penginisialisasi yang Anda tunjuk.Ini bisa lebih baik dari
override init(coder aDecoder: NSCoder) { super.init(coder: aDecoder); }
karena jika Anda perlu menginisialisasi beberapa properti, maka Anda perlu menulis ulang.
sumber
Cepat 5
Jika Anda ingin menulis penginisialisasi kustom
UIViewController
yang diinisialisasi denganstoryBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")
Anda dapat menulis penginisialisasi kustom hanya untuk
Optional
properti.class MyFooClass: UIViewController { var foo: Foo? init(with foo: Foo) { self.foo = foo super.init(nibName: nil, bundle: nil) } public required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.foo = nil } }
sumber