ios - life - Error fatal: uso del inicializador no implementado ''init(codificador:)'' para la clase
viewwillappear (5)
Decidí continuar el proyecto que me quedaba con Swift-language. Cuando agregué la clase personalizada (clase .swift que subclase a UIViewcontroller) en mi viewkeeper de storyboard y cargué el proyecto, la aplicación se bloqueó repentinamente con el siguiente error :
error fatal: uso del inicializador no implementado ''init (codificador :)'' para la clase
Este es un código:
import UIKit
class TestViewController: UIViewController {
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Custom initialization
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// #pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
}
Por favor sugiera algo,
Problema
Esto es causado por la ausencia del inicializador init?(coder aDecoder: NSCoder)
en el UIViewController
objetivo. Ese método es necesario porque se UIViewController
un UIViewController
desde un UIStoryboard
.
Para ver cómo inicializamos un UIViewController
desde un UIStoryboard
, mira here
¿Por qué no es esto un problema con Objective-C?
Porque Objective-C hereda automáticamente todos los inicializadores necesarios de UIViewController
.
¿Por qué Swift no hereda automáticamente los inicializadores?
Swift de forma predeterminada no hereda los inicializadores debido a la seguridad. Pero heredará todos los inicializadores de la superclase si todas las propiedades tienen un valor (u opcional) y la subclase no ha definido ningún inicializador designado.
Solución
1. Primer método
Implementando manualmente init?(coder aDecoder: NSCoder)
en el UIViewController
destino
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
2. Segundo método
Quitando init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
En su destino UIViewController
heredará todos los inicializadores requeridos de la superclase como Dave Wood señaló en su answer continuación
En lugar de agregar algunos métodos para hacer que el mecanismo interno funcione bien, me gustaría definir mis atributos como @lazy e inicializarlos en el alcance de la clase.
Otra opción además de @ 3r1d es eliminar el siguiente método init de su clase:
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Custom initialization
}
La inclusión de ese método init impide que la subclase herede el init(coder aDecoder: NSCoder!)
De su init(coder aDecoder: NSCoder!)
. Al no incluirlo, su clase heredará ambos.
Nota: Vea WWDC 2014 Session 403 "Intermedio Swift" en aproximadamente la marca 33:50 para más detalles.
Para aquellos que necesitan el código en Swift:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
[Editar] Esto fue para una versión anterior de Swift. Posiblemente ya no funciona.
Para las personas que tienen el mismo problema con UICollectionViewCells
rápido, agregue el código que @ 3r1d sugirió a su clase UICollectionViewCell
personalizada y no al controlador de vista:
init(coder aDecoder: NSCoder!)
{
super.init(coder: aDecoder)
}