ios - El inicializador no anula un inicializador designado de su superclase
swift uiviewcontroller (5)
Así que acabo de actualizar a Xcode 6.3 Beta 3 y aparecen muchos errores relacionados con lo siguiente:
El inicializador no anula un inicializador designado de su superclase.
override init() {
super.init()
}
Por ejemplo, esta es una clase UIButton
:
class CustomButton: UIButton {
var target: AnyObject!
var selector: Selector!
var action: (() -> Void)!
override init() { // Initializer does not override a designated initializer from its superclass
super.init() // Must call a designated initializer of the superclass ''UIButton''
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
}
Esta es una de mis clases UIViewController
:
class CustomAlertView: UIViewController {
required init(coder aDecoder: NSCoder) {
fatalError("NSCoding not supported")
}
required override init() { // Initializer does not override a designated initializer from its superclass
super.init() // Must call a designated initializer of the superclass ''UIViewController''
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
}
Creo que esto es mucho más fácil de lo que parece.
Para un SKSpriteNode, estaba haciendo esto:
override init() {
let texture = SKTexture(imageNamed: "bgTile")
super.init(texture: texture, color: nil, size: texture.size())
}
El problema es que init () no es el inicializador designado para SKSpriteNode. Así que simplemente lo cambié a:
override init(texture: SKTexture!, color: UIColor!, size: CGSize) {
let texture = SKTexture(imageNamed: "bgTile")
super.init(texture: texture, color: nil, size: texture.size())
}
Ahora funciona bien.
Hace poco descubrí esto y me gustaría explicar cuál fue el problema. Originalmente respondido en los foros de desarrolladores de Apple .
Parece que Swift ha cambiado la estrategia para la comprobación de la dependencia del inicializador o para impugnar los inicializadores.
Ahora, si sus inicializadores son como se muestra, una forma de lidiar tanto con Xcode 6.3 Beta 2 como con Beta 3 es eliminar todas las definiciones de inicializador:
class CustomButton: UIButton {
var target: AnyObject!
var selector: Selector!
var action: (() -> Void)!
}
class CustomAlertView: UIViewController {
}
Sin definir ningún inicializador designado, las clases heredan todos los inicializadores de sus superclases.
Una solución bastante fácil, pero una gran sorpresa que me dejó perplejo por un tiempo.
Mi solución es una solución rápida, pero creo que es más fácil de lo que Apple pretende en las Notas de la versión. Para obtener más información, busque 19775924 http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf aquí. Lo que Apple dice es que creas un archivo Objective-C y lo extiendes (tienes que agregarlo a los archivos de cabecera y todo) y está en "Problemas conocidos en Xcode 6.3 beta 3", así que creo que es fácil hacer lo que hice :
Así es como lo arreglé para UIButton
:
class CustomButton : UIButton {
init() {
super.init(frame: CGRectZero)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Y este es uno de mis ViewControllers (eliminar público si no es necesario):
public class GenericViewController: UIViewController {
public init() {
super.init(nibName: nil, bundle: nil)
}
required public init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
No uso IB, así que también tengo UIView
, porque separo la vista de viewController
(elimine public si no es necesario):
public class GenericMenuView: UIView {
public init() {
super.init(frame: CGRectZero)
}
public required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Necesito esto especialmente en las vistas porque tengo un método setupViews
que setupViews
en todas las subclases que se setupViews
en el init. Y utilizando AutoLayout no necesito ningún fotograma (por lo tanto, no anulo el init con el parámetro de fotograma).
Entonces parece que tienes que cancelar la override
. Oh! y asegúrese de no llamar a self.init()
o la clase nunca se inicializa (y se bloquea después de un tiempo de espera interno).
Según la documentación de Apple here , lo que está anulando es un inicializador de conveniencia. Entonces, para que su inicializador funcione, tendrá que cambiar el método a
override convenience init() {
super.init()
}
Puede hacerlo, o eliminar el inicializador si no lo está usando, excepto para llamar al inicializador de superclase.
Solución de error: Anular init (codificador aDecoder: NSCoder!) No funciona como se esperaba - Swift
Esto funciona para mí, prueba esto, Nota: debes despertar la punta
override func awakeFromNib() {
super.awakeFromNib()
// Initialisation code
}