Comment écrire init méthodes d'un UIViewController en Swift
Je n'arrive pas à ajouter de la méthode init à la suite de UIViewController classe. J'ai besoin d'écrire du code dans la méthode init. Dois-je écrire init(codeur) méthode? Même lorsque j'ajoute le codeur et le décodeur méthodes, je reçois toujours des erreurs. J'ai aussi essayé d'utiliser la méthode init sans paramètres, mais qui a également ne semble pas fonctionner.
class ViewController: UIViewController {
var tap: UITapGestureRecognizer?
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nil, bundle: nil)
tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
}
...
...
}
Si je l'appelle le super.méthode init() sans paramètres de l'erreur est "Doit appeler désigné un initialiseur de la super-classe" et si je passe le paramètre plume et bundle puis d'erreur est "Nécessaire initialisation init(codeur)".
Même quand j'ajoute init(codeur) et init(décodeur) il ne fonctionne pas.
- Quelle est l'erreur?
- vous devez essayer nécessaire init. J'ai ajouté la réponse @ankit
- Exactement ce que vous voulez ajouter à votre
init()
? Si c'est juste le robinet geste, vous pourriez le faire dansviewDidLoad()
aussi bien, ou même en faire un paresseux var.
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé:
Certaines personnes ont suggéré:
Mais cela vous donne une boucle infinie.
Toutes ces réponses sont des demi-réponses. Certaines personnes éprouvent des boucles infinies dans des postes liés parce qu'ils sont seulement l'ajout de la
convenience init()
(il appelle de manière récursive même si vous n'avez pas de fournir une netteinit()
pour elle la méthode à appeler), tandis que d'autres gens négligent de prolonger la super-classe. Ce format regroupe toutes les solutions pour satisfaire complètement le problème.Edit: Aussi, si vous voulez initialiser toutes les propriétés de la classe à l'aide de paramètres passés en votre
convenience init()
méthode sans tous les substituéeinit()
méthodes de se plaindre, alors vous pouvez définir toutes les propriétés comme implicitement déballé options, ce qui est un motif de utilisé par Apple eux-mêmes.Vous devez remplacer la
init(nibName:bundle:)
initialiseur, et fournir lesinit(coder:)
nécessaire d'initialiseur, et initialisertap
dans les deux d'entre eux:Aussi, assurez-vous lors de l'appel de la super-classe d'initialiseur que vous ne vous contentez pas de passer
nil
pour lanibName
etbundle
. Vous devriez laisser passer tout ce qui était passée dans.required init(coder aDecoder: NSCoder)
, vous avezsuper.init()
... ne pourrait-il pas êtresuper.init(coder: aDecoder)
?tap
dans les deux inits? merci!Vous pouvez simplement créer une commodité d'initialiseur de la place, de la commodité des initialiseurs de ne pas surcharger la fonction init (), mais seulement les appels pour rendre les choses plus facile.
super.init()
?Je pense que vous devez ajouter
ou
Vous devez écrire init trop. Ne retirez pas
Espère que cela aide
Je suis tombé sur cette Question de Vous demandé long chemin de Retour.
Mais personne n'a fourni une base de réponse à la question.
C'est une base de Swift que:-
Sous-classe doit initialiser ses variables avant c'est super classe d'initialisation est terminée.
Donc comme Ankit Goel mentionné l'incident :- "Faut-il appeler un désigné d'initialiseur de la super-classe"
Donc mis à jour le code serait:-