Как добавить пользовательские инициализаторы в 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
Я читал в другом месте, что при добавлении настраиваемого инициализатора необходимо также переопределить, 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 это не проблема)?
источник
MyViewController
?Ответы:
Решил! Необходимо вызвать назначенный инициализатор, который в данном случае является 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() }
источник
Для более общего UIViewController вы можете использовать это начиная с Swift 2.0
init() { super.init(nibName: nil, bundle: nil) }
источник
Не уверен, что вам удалось полностью решить эту проблему ... но в зависимости от того, как вы хотите, чтобы интерфейс вашего класса выглядел, и действительно ли вам нужны функции кодера, вы также можете использовать следующее:
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); }
потому что, если вам нужно инициализировать некоторые свойства, вам нужно будет их переписать.
источник
Swift 5
Если вы хотите написать собственный инициализатор,
UIViewController
который инициализируется с помощьюstoryBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")
Вы можете написать собственный инициализатор только для
Optional
свойств.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 } }
источник