¿Cómo se agregan inicializadores personalizados a las UIViewControllersubclases en Swift?
He creado una subclase UIViewControllerque 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 inity 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 ViewControllersubclase 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:gapes un inicializador designado, puede cumplir con el requisito de implementacióninit:coderconvirtié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
UIViewControllerque se inicializa constoryBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")Puede escribir un inicializador personalizado solo para
Optionalpropiedades.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