Swift: пользовательские инициализаторы ViewController
как добавить пользовательские инициализаторы UIViewController
подклассы в Swift?
Я создал подкласс UIViewController
это выглядит примерно так:
class MyViewController : UIViewController
{
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
self.leftVC = leftVC;
self.rightVC = rightVC;
self.gap = gap;
super.init();
setupScrollView();
setupViewControllers();
}
}
когда я запускаю его, я получаю фатальная ошибка:
фатальная ошибка: использование нереализованного инициализатора "init (nibName:bundle:) "для класса" MyApp.MyViewController'
Я читал elewhere, что при добавлении пользовательского инициализатора нужно также переопределить init(coder aDecoder:NSCoder)
Итак, давайте переопределим это init
и видим, что происходит:
override init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder);
}
если я добавлю это, Xcode жалуется, что self.leftVC is not initialized at super.init call
. Так что, думаю, это тоже не решение. Поэтому мне интересно, как я могу правильно добавить пользовательские инициализаторы в ViewController
подкласс в Swift (так как в Objective-C это, кажется, не проблема)?
3 ответов
решил его! Очевидно, нужно вызвать назначенный инициализатор, который в этом случае является 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()
}
не уверен, что вам удалось полностью решить эту проблему... но в зависимости от того, как вы хотите, чтобы интерфейс вашего класса выглядел и действительно ли вам нужна функциональность кодера, вы также можете использовать следующее:
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)
}