Digamos que eu queira init
uma UIView
subclasse com a String
e an Int
.
Como eu faria isso no Swift se estou apenas subclassificando UIView
? Se eu apenas criar uma init()
função personalizada , mas os parâmetros forem uma String e uma Int, isso me diz que "super.init () não é chamado antes de retornar do inicializador".
E se eu ligar super.init()
, me disseram que devo usar um inicializador designado. O que devo usar lá? A versão do quadro? A versão do codificador? Ambos? Por quê?
fonte
var
. Mas a melhor prática padrão no Swift é declarar variáveis, alet
menos que haja um motivo para declará-lasvar
. Portanto, não havia esse motivo para fazê-lo no meu exemplo de código acimalet
.init(coder:)
.s
ei
opcional para manter as coisas simples aqui. Se não fossem opcionais, também precisariam ser inicializados no inicializador necessário. Torná-los opcionais significa que eles serãonil
quandosuper.init()
chamados. Se eles não fossem opcionais, eles precisariam ser atribuídos antes de chamar super.init ().Eu crio um init comum para o designado e necessário. Por questões de conveniência, eu delego
init(frame:)
com quadro de zero.Ter zero quadro não é um problema, porque normalmente a visualização está dentro da visualização de um ViewController; sua visualização personalizada terá uma chance boa e segura de planejar suas subvisões quando a supervisão ligar
layoutSubviews()
ouupdateConstraints()
. Essas duas funções são chamadas pelo sistema recursivamente em toda a hierarquia de visualizações. Você pode usarupdateContstraints()
oulayoutSubviews()
.updateContstraints()
é chamado primeiro, entãolayoutSubviews()
. EmupdateConstraints()
certifique-se chamar de super última . EmlayoutSubviews()
, ligue super primeiro .Aqui está o que eu faço:
fonte
commonInit
método, mas não puder colocá-las depoissuper
neste caso, porque você deve inicializar todas as propriedades ANTES desuper
chamar. Lol, parece um loop morto.Aqui está como eu faço isso no iOS 9 no Swift -
Aqui está um projeto completo com exemplo:
fonte
super.init
, mas ele disse que deve ser feito antessuper.init
...Aqui está como eu faço uma subview no iOS no Swift -
fonte