IBOutlets et IBactions besoin ! en fin de compte
J'ai essayé de démarrer et aller de l'Obj-C pour Swift aujourd'hui et j'ai été la lecture de la documentation. J'ai essayé de créer facilement un IBOutlet rapide et constamment m'a donné ces erreurs.
View Controller has no initialiser
nécessaire init(codeur aDecoder: NSCoder) {
fatalError("init(coder:) n'a pas été mis en œuvre") }
IBOutletproperty has non-optional type 'UILabel'
et qui, en permanence, apparaît avec ce code:
@IBOutlet var outputLabel : UILabel
mais quand j'ajoute un ! marque, il fonctionne sans erreurs comme
@IBOutlet var outputLabel : UILabel!
Même chose se produit pour IBActions...
- Je dirais tot lire le deuxième réponse: stackoverflow.com/questions/24006975/... Il est tout à fait utile.
- puis-je vous demander, j'ai vérifié certains didacticiels vidéo en ligne et ils n'ont jamais mis le !... Pourquoi n'ont-ils pas et nous devons? Merci
- Les tutoriels vidéo peuvent être obsolètes - à l'origine de la
IBOutlet
décorateur fait la propriété est facultative eh bien, cela a été changé très tôt. - ouais, comme @jrturton dit. Maintenant, vous devez mettre la ! à la et de, car il aura sa valeur qu'après l'initialisation.
- Ok. Merci beaucoup les gars!!
Vous devez vous connecter pour publier un commentaire.
Tout d'abord apprendre à se connaître, ce qui est effectivement
!
et?
?
: si la valeur peut devenir nul à l'avenir, de sorte que vous testez pour cela.!
: si vraiment il ne devrait pas être nul dans l'avenir, mais il doit être nul initialement.@IBOutlet:
Lorsque vous déclarez une prise en Swift, le compilateur convertit automatiquement le type de faible implicitement déballé en option et de lui assigner une valeur initiale de
nil
.En effet, le compilateur remplace
@IBOutlet var name:
Type avec@IBOutlet weak var name: Type! = nil
.Xcode allait changer et la Force de limiter, pour déclarer
@IBOutlet
non de l'option de type de variable , suivant les deux type de déclaration pour@IBOutlet
est Valide jusqu'à la date.Cependant, si vous faites glisser un contrôle de sortie d'un label en bêta 4 ce qui se passe:
Interface builder de données est chargé après-vue-contrôleur a été entrepris, de sorte que les prises ne peuvent pas avoir de valeur après l'initialisation. Implicitement déballé propriétés facultatives (sorties dans ce cas) vous promets que les propriétés pourraient être nul après l'objet est lancé, mais leur valeur sera attribuée plus tard (après le chargement de la plume ou storyboard).
Qui est correct. En Swift, une variable de type X ne peut pas être nul, le sens qu'il doit être initialisé. Cela signifie que vous devez initialiser soit dans un
init
méthode, ou en ligne initialiser.Généralement, vue contrôleurs de déclarer des variables de types qui sont en option - pour exemple,
@IBOutlet var outputLabel : UILabel!
Cela signifie que vous n'avez pas besoin d'initialiser le
outputLabel
, et par défaut, sa valeur estnil
. C'est le modèle général pourIBOutlet
variables, comme les variables sont définies à l'extérieur de lainit
méthode.Si vous ne faites pas vos variables en option, vous devez l'initialiser. Si vous n'initialisez pas en ligne, vous devez fournir un
init
méthode - d'où l'erreur que vous obtenez.init
méthodes. Par exemple, vous en avez un ici: nécessaire init(codeur aDecoder: NSCoder) { super.init(codeur: aDecoder) }Que la Pile permet de Q et Un style de questions, je vais aussi la mettre en plus facile mots. Il suffit de mettre la
!
à la et de points de vente, les gars. Merci beaucoup pour votre aide.L'erreur
soudainement commencé quand j'ai ajouté
à un travail auparavant sous-classe de UIViewController sinon tous les faits de l'IB.
Changer de
fixe. C'est un surprenant d'erreur (hein? init? codeur?) pour une simple modifier de quelqu'un lancement d'une application pourrait faire à long avant qu'ils rencontrent des codeurs ou de créer leurs propres méthodes init, que peut-être il contribue à montrer explicitement que l'initialisation besoin n'est pas limitée à IBOutlets. Les réponses ci-dessus décrivent la cause racine.
Lorsque les vues ou la vue des contrôleurs sont initialisé à partir d'une interface builder fichier, de leurs points de vente ne peut pas être connecté encore. Ils ne seront connectés après l'initialisation, de sorte qu'ils doivent être en option. Lorsque tout autre code dans la classe est appelée après l'initialisation, cependant, ces points de vente sont garantis d'être connecté. C'est pourquoi IBOutlets sont toujours déclarés comme implicitement déballé options.
Alors qu'il semble comme XCode est la bénédiction de ce comportement, il est toujours dangereux et vous gardez toujours à l'esprit que vous voudrez peut-être faire quelques Options.
Tout IB initialiser ces pour vous, cela ne garantit pas qu'ils ne deviennent néant plus tard ... par exemple, si vous avez besoin de supprimer un IBOutlet comme une sous-vue, ou de manière conditionnelle d'un NSLayoutConstraint.est actif = false (ce qui d'un fâcheusement furtif nul).