ios objective-c uiviewcontroller swift subclass

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) }