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,
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
Parce que Objective-C hérite automatiquement de tous les initialiseurs UIViewController
requirejs.
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é.
init?(coder aDecoder: NSCoder)
manuellement init?(coder aDecoder: NSCoder)
sur le UIViewController
cible
required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }
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.