No estoy usando un UIViewController
de un guión gráfico y quiero tener una init
función personalizada donde paso un NSManagedObjectID
de algún objeto. Solo quiero llamar super.init()
como lo hice en Objective-C. Me gusta esto:
init(objectId: NSManagedObjectID) {
super.init()
}
Pero obtengo el siguiente error del compilador:
Debe llamar al inicializador designado de la superclase UIViewController
¿Puedo simplemente dejar de hacer esto?
fuente
initWithCoder:
proviene delNSCoding
protocolo ... Todavía no puedo entender cuál es su papel en la inicialización de una instancia de UIViewController, si es un inicializador "designado" de UIViewController o cualquiera de sus superclases ... .let
propiedades, en su caso:super.init(nibName: nil, bundle: nil)
.Otra buena solución es declarar su nuevo inicializador como
convenience
inicializador de la siguiente manera:convenience init( objectId : NSManagedObjectID ) { self.init() // ... store or user your objectId }
Si declara que no hay inicializadores designados en su subclase, se heredan automáticamente y puede usarlos
self.init()
dentro de su inicializador de conveniencia.En el caso de UIViewController, el método init predeterminado llamará
init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)
connil
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 } }
fuente
myString
está configurado para""
queinit
no sea necesario. Esta solución se desmorona si no desea usar un valor inicial y, en ese caso, debe usarloself.init(nibName: nil, bundle:nil)
myString
propiedad sea opcionalPara mejorar la respuesta del occulus :
init() { super.init(nibName: nil, bundle: nil) }
fuente
Actualización: agregue el enlace
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init
Según la documentación para iOS, el inicializador designado para UIViewController es
initWithNibName: bundle:
.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 inicializador de conveniencia:
convenience init( objectId : NSManagedObjectID ) { self.init() // other code...
}
fuente