Erreur fatale: utilisation de l'initialiseur 'init (coder :)' non implémenté pour la class

J'ai décidé de continuer mon projet restant avec le langage Swift. Quand j'ai ajouté la class personnalisée (class .swift qui sous-class à UIViewcontroller) dans mon viewboard controller storyboard et chargé le projet, l'application se bloque soudainement avec l' erreur suivante:

Erreur fatale: utilisation de l'initialiseur 'init (coder :)' non implémenté pour la class

Ceci est un code:

import UIKit class TestViewController: UIViewController { init(nibName nibNameOrNil: Ssortingng?, 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. } */ } 

S'il vous plaît suggérer quelque chose,

Problème

Ceci est dû à l'absence de l'initialiseur init?(coder aDecoder: NSCoder) sur le UIViewController cible. Cette méthode est requirejse car l'instanciation d'un UIViewController depuis un UIStoryboard appelle.

Pour voir comment nous initialisons un UIViewController depuis un UIStoryboard , jetez un coup d'oeil ici

Pourquoi n'est-ce pas un problème avec Objective-C?

Parce que Objective-C hérite automatiquement de tous les initialiseurs UIViewController requirejs.

Pourquoi Swift n'hérite-t-il pas automatiquement les initialiseurs?

Swift par défaut n'hérite pas des initialiseurs pour des raisons de security. Mais il héritera de tous les initialiseurs de la superclass si toutes les propriétés ont une valeur (ou optionnelle) et que la sous-class n'a défini aucun initialiseur désigné.


Solution

1. Première méthode

init?(coder aDecoder: NSCoder) manuellement init?(coder aDecoder: NSCoder) sur le UIViewController cible

 required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } 

2. Deuxième méthode

Supprimer init(nibName nibNameOrNil: Ssortingng?, bundle nibBundleOrNil: NSBundle?) Sur votre cible UIViewController héritera de tous les initialiseurs requirejs de la superclass comme Dave Wood l'a indiqué dans sa réponse ci-dessous


Une autre option que @ 3r1d est de supprimer à la place la méthode init suivante de votre class:

 init(nibName nibNameOrNil: Ssortingng?, bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) // Custom initialization } 

Y compris cette méthode init, empêche la sous-class d'hériter de l' init(coder aDecoder: NSCoder!) De sa super class. En ne l'incluant pas, votre class héritera des deux.

Remarque: Voir WWDC 2014 Session 403 "Intermediate Swift" à peu près à la marque 33:50 pour plus de détails.

Pour les personnes ayant le même problème avec UICollectionViewCells rapide, ajoutez le code que @ 3r1d a suggéré à votre class UICollectionViewCell personnalisée et non au View Controller:

 init(coder aDecoder: NSCoder!) { super.init(coder: aDecoder) } 

Pour ceux qui ont besoin du code dans Swift:

 required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } 

[Modifier] C'était pour une ancienne version de Swift. Peut-être ne fonctionne plus.

Plutôt que d'append quelques methods pour que le mécanisme interne fonctionne correctement, je définirais mes attributes comme @lazy et les initialiserais directement dans la scope de la class.