No estoy usando un UIViewControllerde un guión gráfico y quiero tener una initfunción personalizada donde paso un NSManagedObjectIDde 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 delNSCodingprotocolo ... 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 ... .letpropiedades, en su caso:super.init(nibName: nil, bundle: nil).Otra buena solución es declarar su nuevo inicializador como
convenienceinicializador 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!)connilambos argumentos (Command-Click en UIViewController le dará esa información).TL; TR : Si prefiere trabajar programáticamente con
UIViewControllers, 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
myStringestá configurado para""queinitno 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)myStringpropiedad 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