ios - Swift: inicializadores personalizados de ViewController
objective-c uiviewcontroller (3)
¡Resuelto! Uno tiene que llamar al inicializador designado, que en este caso es el inicio 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()
}
¿Cómo agregar inicializadores personalizados a UIViewController
subclases UIViewController
en Swift?
He creado una subclase de 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 me sale 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 init(coder aDecoder:NSCoder)
ese init
y veamos qué sucede:
override init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder);
}
Si agrego esto, Xcode se queja de que self.leftVC is not initialized at super.init call
. Así que supongo que tampoco puede ser la solución. Así que me pregunto cómo puedo agregar inicializadores personalizados correctamente a una subclase de ViewController
en Swift (ya que en Objective-C esto no parece ser un problema).
No estoy seguro si logró resolverlo completamente ... pero dependiendo de cómo quiera que se vea la interfaz de su clase y de 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)
}
Como init:leftVC:rightVC:gap
es un inicializador designado, puede cumplir con el requisito de implementar init:coder
al convertirlo 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, entonces deberá reescribirlas.
Para un UIViewController más genérico puede usar esto a partir de Swift 2.0
init() {
super.init(nibName: nil, bundle: nil)
}