Disons que je veux init
une UIView
sous - classe avec un String
et un Int
.
Comment ferais-je cela dans Swift si je ne fais que sous-classer UIView
? Si je fais juste une init()
fonction personnalisée mais que les paramètres sont une chaîne et un int, cela me dit que "super.init () n'est pas appelé avant de revenir de l'initialiseur".
Et si j'appelle, on super.init()
me dit que je dois utiliser un initialiseur désigné. Que dois-je utiliser là-bas? La version cadre? La version du codeur? Tous les deux? Pourquoi?
la source
var
. Mais la meilleure pratique par défaut dans Swift est de déclarer des variables àlet
moins qu'il n'y ait une raison de les déclarervar
. Il n'y avait aucune raison de le faire dans mon exemple de code ci-dessus, par conséquentlet
.init(coder:)
.s
eti
facultatif pour garder les choses simples ici. S'ils n'étaient pas facultatifs, ils devraient également être initialisés dans l'initialiseur requis. En les rendant facultatifs, cela signifie qu'ils sontnil
quand ilssuper.init()
sont appelés. S'ils n'étaient pas optionnels, ils auraient en effet besoin d'être affectés avant d'appeler super.init ().Je crée un init commun pour le désigné et requis. Pour plus de commodité, je délègue à
init(frame:)
avec un cadre de zéro.Avoir zéro frame n'est pas un problème car la vue se trouve généralement dans la vue d'un ViewController; votre vue personnalisée aura une bonne chance de mettre en page ses sous-vues lorsque sa supervision appelle
layoutSubviews()
ouupdateConstraints()
. Ces deux fonctions sont appelées par le système de manière récursive dans toute la hiérarchie des vues. Vous pouvez utiliser soitupdateContstraints()
oulayoutSubviews()
.updateContstraints()
est appelé en premier, alorslayoutSubviews()
. EnupdateConstraints()
assurez - vous d'appeler super - dernier . DanslayoutSubviews()
, appelez super d' abord .Voici ce que je fais:
la source
commonInit
méthode, mais que vous ne pouvez pas le placer aprèssuper
dans ce cas, car vous devez initialiser toutes les propriétés AVANT l'super
appel. Lol, ça ressemble à une boucle morte.Voici comment je le fais sur iOS 9 dans Swift -
Voici un projet complet avec exemple:
la source
super.init
, mais il a dit que cela devrait être fait avantsuper.init
...Voici comment faire une sous-vue sur iOS dans Swift -
la source