Swift: Penginisialisasi ViewController Kustom

87

Bagaimana Anda menambahkan penginisialisasi kustom ke UIViewControllersubclass di Swift?

Saya telah membuat sub kelas UIViewControlleryang 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 initdan 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 ViewControllersubclass di Swift (karena di Objective-C ini sepertinya tidak menjadi masalah)?

BadmintonCat
sumber
Bagaimana Anda mencoba membuat contoh MyViewController?
Mike Pollard
Mengapa tidak membuat instantiate semuanya di viewDidLoad (), di sana Anda dapat menginisialisasinya seperti yang Anda inginkan
tudoricc
@MikePollard dengan dualViewCtrl = DualViewCtrl (leftVC: l, rightVC: r, gap: 50) ... Saya sudah tahu bahwa saya perlu menggunakan initWithNib penginisialisasi.
BadmintonCat
3
@tudoricc Karena sering kali Anda menginginkan properti instance yang diinisialisasi dengan aman di penginisialisasi dengan parameter yang diberikan. Anda tidak dapat melakukannya di viewDidLoad sejak saat itu tidak ada jaminan bahwa properti tersedia saat diperlukan.
BadmintonCat
Saya minta maaf karena dalam pikiran saya, saya melihat viewDidLoad () sebagai inisialisasi.
terima kasih

Jawaban:

125

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()
}
BadmintonCat
sumber
31
Singkirkan titik koma yang jelek itu :)
MobileMon
8
Saya suka titik koma. Mereka membuat kode kurang ambigu, terutama dengan nama dan tanda tangan Cocoa / Cocoa-Touch API yang sangat bertele-tele. Keputusan buruk dari desainer Swift untuk menghapusnya IMHO.
BadmintonCat
25
IMHO, jika Anda mengetik karakter dan itu tidak mempengaruhi biner yang dikompilasi, Anda tidak boleh mengetiknya :)
Sam Soffes
33
@ SamSoffes jadi Anda tidak menggunakan spasi (ekstra) sama sekali? Dan Anda mengaburkan semua simbol menjadi karakter tunggal?
Victor Jalencas
8
Diskusi ini mengingatkan saya pada tab vs spasi di Silicon Valley
Aaron
14

Untuk UIViewController yang lebih umum, Anda dapat menggunakan ini pada Swift 2.0

init() {
    super.init(nibName: nil, bundle: nil)
}
Tr0yJ
sumber
11

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:gapmerupakan penginisialisasi yang ditunjuk, Anda dapat memenuhi persyaratan penerapan init:coderdengan 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.

wlingke.dll
sumber
8

Cepat 5

Jika Anda ingin menulis penginisialisasi kustom UIViewControlleryang diinisialisasi denganstoryBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")

Anda dapat menulis penginisialisasi kustom hanya untuk Optionalproperti.

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
    }
}
emrcftci
sumber