Comment puis-je écrire une coutume init pour une sous-classe UIView dans Swift?
Dire que je veux init
un UIView
sous-classe avec un String
et un Int
.
Comment faire en Swift si je suis juste sous-classement UIView
? Si je viens de faire un custom init()
fonction, mais les paramètres sont une Chaîne de caractères et un entier (Int), il me dit que "super.init() n'est pas appelé avant le retour à partir de l'initialiseur".
Et si je l'appelle super.init()
je me suis dit que je doit utiliser un désigné d'initialiseur. Que dois-je être à l'aide de là-bas? La version châssis? Le codeur version? Les deux? Pourquoi?
Vous devez vous connecter pour publier un commentaire.
La
init(frame:)
version est l'initialisation par défaut. Vous devez appeler seulement après initialiser vos variables d'instance. Si ce point de vue est reconstitué à partir d'une Plume, puis personnalisé de votre initialiseur ne sera pas appelé, et au lieu de lainit?(coder:)
version sera appelée. Depuis Swift exige maintenant une mise en œuvre de la nécessaireinit?(coder:)
, j'ai mis à jour l'exemple ci-dessous et changé lelet
les déclarations de variablevar
et facultatif. Dans ce cas, vous devez les initialiser dansawakeFromNib()
ou plus tard.var
. Mais le défaut de meilleures pratiques dans Swift est de déclarer les variableslet
sauf si il y a une raison pour déclarervar
. Il n'y avait pas de raison de le faire dans mon exemple de code ci-dessus, d'oùlet
.init(coder:)
.super.init()
doit être appelée avant l'initialisation de l'auto params?s
eti
en Option pour garder les choses simples ici. S'ils n'étaient pas en option, il devra aussi être initialisé dans l'initialiseur. Rendant facultatif signifie qu'ils sont à êtrenil
quandsuper.init()
est appelé. S'ils n'étaient pas en option, ils devraient en effet être attribuée avant l'appel à super.init().self.i
etself.s
dansint?(coder)
? Je sais qu'il compile parce que swift options. Sommes-nous censés nous initialiser ailleurs? Où? Pourquoi ne pouvons-nous pas dansint?(coder)
comme avec les autres inits?nil
si vous ne fournissez pas un seul de vous-même.J'ai créer un init pour l'désignés et nécessaire. Pour des raisons de commodité inits j'ai délégué à
init(frame:)
avec cadre de zéro.Avoir zéro image n'est pas un problème parce que en général, la vue est à l'intérieur d'un ViewController de vue; votre vue personnalisée d'obtenir une bonne, coffre-fort chance à la disposition de ses sous-vues lors de ses superview appels
layoutSubviews()
ouupdateConstraints()
. Ces deux fonctions sont appelées par le système de façon récursive dans la vue de la hiérarchie. Vous pouvez utiliserupdateContstraints()
oulayoutSubviews()
.updateContstraints()
est appelé en premier, puislayoutSubviews()
. DansupdateConstraints()
assurez-vous d'appeler super dernier. DanslayoutSubviews()
, appelez super première.Voici ce que je fais:
commonInit
méthode, mais vous ne pouvez pas le placer aprèssuper
dans ce cas, car il faut initialiser toutes les propriétés AVANT desuper
appel. Lol il semble comme des morts de la boucle.Ici est de savoir comment je le fais sur iOS 9 Swift -
Ici est un projet complet avec exemple:
super.init
, mais il a dit qu'il devrait être fait avant desuper.init
...return
ou les points-virgules.Voici comment je le fais une sous-vue sur iOS dans Swift -