Swift:自定义ViewController初始值设定项

你如何添加自定义初始化器到Swift中的UIViewController子类?

我创build了一个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 。 所以我想这也不是解决scheme。 所以我想知道如何将自定义初始化器正确地添加到Swift中的ViewController子类(因为在Objective-C中,这似乎不成问题)?

解决了! 一个人必须调用指定的初始化程序,在这种情况下是init的nibName,显然…

 init(leftVC:UIViewController, rightVC:UIViewController, gap:Int) { self.leftVC = leftVC self.rightVC = rightVC self.gap = gap super.init(nibName: nil, bundle: nil) setupScrollView() setupViewControllers() } 

不知道你是否设法完全解决了这个问题…但取决于你希望你的类的界面看起来以及你是否真的需要编码器的function,你也可以使用下面的代码:

 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) }