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ではこれは問題ではないようです)。
解決しました!指定された初期化子を呼び出す必要があります。この場合、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()
}
これを完全に解決できたかどうかはわかりませんが、クラスのインターフェースをどのように表示するか、実際にコーダー機能が必要かどうかに応じて、以下を使用することもできます。
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);
}
いくつかのプロパティを初期化する必要がある場合、それらを書き換える必要があるためです。
より一般的なUIViewControllerの場合、Swift 2.0の時点でこれを使用できます
init() {
super.init(nibName: nil, bundle: nil)
}