web-dev-qa-db-fra.com

Erreur fatale: utilisation d'initialisateur non implémenté 'init (codeur :)' pour la classe

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,

145
Pratik Bhiyani

Problème

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

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

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

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

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é.


Solution

1. Première méthode

Implémentation manuelle de init?(coder aDecoder: NSCoder) sur la cible UIViewController

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

2. Deuxième méthode

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


197
EridB

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.

25
Dave Wood

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)
}
9
Nick Yap

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.

3
MXV

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

0
Lance Samaria

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. 

0
hasancan85