J'ai décidé de poursuivre mon projet restant avec Swift-language.Lorsque j'ai ajouté la classe personnalisée (classe .Swift qui est sous-classe à UIViewcontroller) dans mon contrôleur de vue de storyboard et chargé le projet que l'application s'est bloquée avec la suite error :
erreur fatale: utilisation d'initialiseur non implémenté 'init (codeur :)' pour la classe
Ceci est un code:
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.
}
*/
}
S'il vous plaît suggérer quelque chose,
Ceci est dû à l'absence de la fonction init?(coder aDecoder: NSCoder)
de l'initialiseur sur la variable UIViewController
. Cette méthode est requise car l'instanciation d'une UIViewController
à partir d'une UIStoryboard
l'appelle.
Pour voir comment nous initialisons une UIViewController
à partir d'une UIStoryboard
, jetez un coup d'œil ici
Parce que Objective-C hérite automatiquement de tous les initialiseurs UIViewController
requis.
Swift par défaut n'hérite pas des initialiseurs pour des raisons de sécurité. Mais il héritera de tous les initialiseurs de la superclasse si toutes les propriétés ont une valeur (ou facultative) et que la sous-classe n'a défini aucun initialiseur désigné.
Implémentation manuelle de init?(coder aDecoder: NSCoder)
sur la cible UIViewController
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
Supprimer init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
sur votre cible UIViewController
héritera de la super-classe de tous les initialiseurs requis, comme Dave Wood pointait sur son réponse ci-dessous
Une autre option en plus de @ 3r1d consiste à supprimer la méthode init suivante de votre classe:
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Custom initialization
}
L'inclusion de cette méthode init empêche la sous-classe d'hériter de la init(coder aDecoder: NSCoder!)
de sa super classe. En ne l'incluant pas, votre classe héritera des deux.
Remarque: voir la session 403 de la WWDC 2014 "Intermédiaire" au environ de 33:50 pour plus de détails.
Pour les personnes ayant le même problème avec Swift UICollectionViewCells
, ajoutez le code suggéré par @ 3r1d dans votre classe UICollectionViewCell
personnalisée et non dans le contrôleur de vue:
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)
}
[Edit] C'était pour une ancienne version de Swift. Peut-être que ça ne marche plus.
J'ai eu ce problème dans une cellule programmatique collectionView et, même si l'op est une question sur un vc, je suis toujours tombé sur cette question lorsque j'ai cherché une réponse. Pour moi, le problème était que j'avais
`required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}`
mis en œuvre de sorte que la première réponse ne fonctionne pas. Ce que je n'avais pas dans la cellule était l'initialiseur:
// my programmatic cell was missing this
override init(frame: CGRect) {
super.init(frame: frame)
}
Une fois que j'ai ajouté l'erreur est partie
Plutôt que d’ajouter des méthodes pour que le mécanisme interne fonctionne correctement, j’aimerais définir mes attributs comme étant @lazy et les initialiser directement dans le champ de la classe.