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?
El inicializador designado para UIViewController
es initWithNibName:bundle:
Deberías llamar a eso en su lugar.
Si no tiene un plumín, ingrese nil
para el nibName (el paquete también es opcional). Luego, podría construir una vista personalizada en loadView
o agregando subvistas a self.view
en viewDidLoad
, como solía hacerlo.
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...
}