Error fatal: uso del inicializador no implementado ‘init (codificador :)’ para la clase

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 objective. Ese método es necesario porque se UIViewController un UIViewController desde un UIStoryboard .

Para ver cómo inicializamos un UIViewController desde un UIStoryboard , mira aquí

¿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 respuesta a continuación


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 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) } 

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.

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 scope de la clase.