¿Cómo se agregan inicializadores personalizados a las UIViewController
subclases en Swift?
He creado una subclase UIViewController
que se parece a esto:
class MyViewController : UIViewController
{
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
self.leftVC = leftVC;
self.rightVC = rightVC;
self.gap = gap;
super.init();
setupScrollView();
setupViewControllers();
}
}
Cuando lo ejecuto, aparece un error fatal:
error fatal: uso del inicializador no implementado 'init (nibName: bundle :)' para la clase 'MyApp.MyViewController'
He leído en otro lugar que cuando se agrega un inicializador personalizado, también se debe anular, init(coder aDecoder:NSCoder)
así que anulemos eso init
y veamos qué sucede:
override init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder);
}
Si agrego esto, Xcode se queja de eso self.leftVC is not initialized at super.init call
. Así que supongo que tampoco puede ser la solución. Entonces, me pregunto cómo puedo agregar inicializadores personalizados correctamente a una ViewController
subclase en Swift (ya que en Objective-C esto parece no ser un problema).
fuente
MyViewController
?Respuestas:
¡Resuelto! Uno tiene que llamar al inicializador designado que en este caso es el init con nibName, obviamente ...
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int) { self.leftVC = leftVC self.rightVC = rightVC self.gap = gap super.init(nibName: nil, bundle: nil) setupScrollView() setupViewControllers() }
fuente
Para un UIViewController más genérico, puede usar esto a partir de Swift 2.0
init() { super.init(nibName: nil, bundle: nil) }
fuente
No estoy seguro si logró resolver esto por completo ... pero dependiendo de cómo desee que se vea la interfaz de su clase y si realmente necesita o no la funcionalidad del codificador, también puede usar lo siguiente:
convenience required init(coder aDecoder: NSCoder) { //set some defaults for leftVC, rightVC, and gap self.init(leftVC, rightVC, gap) }
Dado que
init:leftVC:rightVC:gap
es un inicializador designado, puede cumplir con el requisito de implementacióninit:coder
convirtiéndolo en un inicializador de conveniencia que llame a su inicializador designado.Esto podría ser mejor que
override init(coder aDecoder: NSCoder) { super.init(coder: aDecoder); }
porque si necesita inicializar algunas propiedades, deberá volver a escribirlas.
fuente
Rápido 5
Si desea escribir un inicializador personalizado en el
UIViewController
que se inicializa constoryBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")
Puede escribir un inicializador personalizado solo para
Optional
propiedades.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 } }
fuente