que life initializers has ios objective-c uiviewcontroller swift ios8

ios - life - ¿Por qué no puedo llamar al super.init() predeterminado en UIViewController en Swift?



view controller que es (4)

No estoy usando un UIViewController de un guión gráfico y quiero tener una función de init personalizada donde paso un NSManagedObjectID de algún objeto. Solo quiero llamar a super.init() como lo hice en Objective-C. Me gusta esto:

init(objectId: NSManagedObjectID) { super.init() }

Pero obtengo el siguiente error de compilación:

Debe llamar al inicializador designado de la superclase UIViewController

¿Puedo simplemente no hacer esto más?



Otra buena solución es declarar su nuevo inicializador como un inicializador de convenience siguiente manera:

convenience init( objectId : NSManagedObjectID ) { self.init() // ... store or user your objectId }

Si no declara ningún inicializador designado en su subclase, se hereda automáticamente y puede usar self.init() dentro de su inicializador de conveniencia.

En el caso de UIViewController, el método init por defecto llamará a init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) Con nil para ambos argumentos (Command-Click en UIViewController le dará esa información).

TL; TR : si prefiere trabajar programáticamente con UIViewController s aquí hay un ejemplo de trabajo completo que agrega un nuevo inicializador con un argumento personalizado:

class MyCustomViewController: UIViewController { var myString: String = "" convenience init( myString: String ) { self.init() self.myString = myString } }


Para mejorar la respuesta del occulus :

init() { super.init(nibName: nil, bundle: nil) }


Actualización: agregue el enlace

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init

De acuerdo con la documentación para iOS, el inicializador designado para UIViewController es initWithNibName: bundle:

Si subclase UIViewController, debe llamar a la implementación súper de este método, incluso si no está utilizando un NIB.

Puedes hacerlo de la siguiente manera:

init(objectId : NSManagedObjectID) { super.init(nibName: (xib''s name or nil''), bundle: nil) // other code... }

o

Declare un nuevo inicializador como un inicializador de conveniencia:

convenience init( objectId : NSManagedObjectID ) { self.init() // other code...

}