157 votes

Erreur fatale : utilisation d’initialiseur lettre morte ' init(coder:) ' pour la classe

J’ai décidé de continuer mon projet restant avec swift-langue. Alors, j’ai ajouté la classe personnalisée (classe .swift qui sub classe à UIViewcontroller) dans ma table de montage séquentiel viewcontroller et chargé du projet l’écrasement app soudainement avec l’erreur suivante :

Il s’agit d’un code :

Veuillez suggérer quelque chose,

211voto

eridb Points 2606

Question

Il vous manque de l' initWithCoder méthode sur l' destinationViewController que vous essayez de présenter.

L' initWithCoder méthode est appelée lorsque vous instanciez l' viewController se référant à l' UIStoryboard comme ceci: Instancier un viewController en Swift

Le problème semble être provoqué par différents initialiseur de comportement entre Swift et Objective-C.


Solution

Objective-C hérite automatiquement initWithCoder c'est pourquoi nous n'avons pas besoin de l'ajouter à destinationViewController.

Swift nécessite l'ajout d' init(coder aDecoder: NSCoder!) si vous avez init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) sur votre destinationViewController.


1. Première méthode

Manuellement la mise en œuvre de init(coder aDecoder: NSCoder!) en l'ajoutant le code ci-dessous pour destinationViewController.

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

2. Deuxième méthode

Retrait d' init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle? à votre destinationViewController héritera de tous les initialiseurs de la super-classe comme @Dave Wood souligné.

//Code to be removed from your destinationViewController
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // Here you can init your properties
}

Mais si vous travaillez avec des XIB fichiers et vous avez besoin d'init de l' properties aussi, vous avez besoin de cette méthode. Il est donc dans votre propre mains à utiliser :)


26voto

Dave Wood Points 2641

Une autre option en plus de @3r1d est à retirer à la place la méthode init suivant votre classe :

Y compris cette méthode init, empêche la classe sup d’hériter la `` de sa superclasse. En l’incluant ne pas, votre classe hérite tous les deux.

Remarque : Voir WWDC 2014 Session 403 « Intermédiaire Swift » à quelques mots sur la marque 33:50 pour plus de détails.

10voto

yapster Points 85

Pour les personnes ayant le même problème avec swift , ajoutez le code que @3r1d suggéré votre Custom classe et non à la vue du contrôleur :

1voto

hasancan85 Points 1

Plutôt que d’ajouter quelques méthodes pour mettre le mécanisme interne au service très bien, j’irais avec définissant mes attributs comme @lazy en initialiser leur droit à la portée de la classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X