web-dev-qa-db-ja.com

Swift:カスタムViewController初期化子

SwiftのUIViewControllerサブクラスにカスタム初期化子を追加するにはどうすればよいですか?

次のようなUIViewControllerのサブクラスを作成しました。

class MyViewController : UIViewController
{
    init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
    {
        self.leftVC = leftVC;
        self.rightVC = rightVC;
        self.gap = gap;

        super.init();

        setupScrollView();
        setupViewControllers();
    }
}

実行すると、致命的なエラーが発生します。

致命的エラー:クラス「MyApp.MyViewController」に未実装のイニシャライザー「init(nibName:bundle :)」を使用

カスタム初期化子を追加するときは、init(coder aDecoder:NSCoder)もオーバーライドする必要があることをどこかで読みました。そのため、そのinitをオーバーライドして、何が起こるか見てみましょう。

override init(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder);
}

これを追加すると、Xcodeはself.leftVC is not initialized at super.init callと文句を言います。だから、それも解決策ではないでしょう。したがって、SwiftのViewControllerサブクラスにカスタム初期化子を適切に追加するにはどうすればよいのでしょう(Objective-Cではこれは問題ではないようです)。

77
BadmintonCat

解決しました!指定された初期化子を呼び出す必要があります。この場合、nibNameを使用したinitです。明らかに...

init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
    self.leftVC = leftVC
    self.rightVC = rightVC
    self.gap = gap

    super.init(nibName: nil, bundle: nil)

    setupScrollView()
    setupViewControllers()
}
107
BadmintonCat

これを完全に解決できたかどうかはわかりませんが、クラスのインターフェースをどのように表示するか、実際にコーダー機能が必要かどうかに応じて、以下を使用することもできます。

convenience required init(coder aDecoder: NSCoder)
{
    //set some defaults for leftVC, rightVC, and gap
    self.init(leftVC, rightVC, gap)
}

init:leftVC:rightVC:gapは指定された初期化子なので、指定された初期化子を呼び出す便利な初期化子にすることで、init:coderを実装する要件を満たすことができます。

これは

override init(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder);
}

いくつかのプロパティを初期化する必要がある場合、それらを書き換える必要があるためです。

11
wlingke

より一般的なUIViewControllerの場合、Swift 2.0の時点でこれを使用できます

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