Powiedzmy chcę init
na UIView
podklasy z String
i Int
.
Jak mam to zrobić w Swift, skoro tylko podklasuję UIView
? Jeśli po prostu init()
utworzę funkcję niestandardową, ale parametry to String i Int, to mówi mi, że „super.init () nie jest wywoływana przed powrotem z inicjatora”.
A jeśli zadzwonię super.init()
, powiedziano mi, że muszę użyć wyznaczonego inicjatora. Czego mam tam używać? Wersja ramowa? Wersja kodera? Obie? Czemu?
źródło
var
. Ale domyślną najlepszą praktyką w Swift jest deklarowanie zmiennych,let
chyba że istnieje powód, aby je zadeklarowaćvar
. W związku z tym w powyższym przykładzie kodu nie było takiego powodulet
.init(coder:)
.s
ii
opcjonalnie, aby wszystko było proste. Gdyby nie były opcjonalne, musiałyby również zostać zainicjowane w wymaganym inicjatorze. Uczynienie ich opcjonalnymi oznacza, że mogą być,nil
gdysuper.init()
zostanie wywołany. Gdyby nie były opcjonalne, rzeczywiście należałoby je przypisać przed wywołaniem super.init ().Tworzę wspólny init dla wyznaczonych i wymaganych. Dla wygody deleguję inity
init(frame:)
z ramką zerową.Brak ramki nie jest problemem, ponieważ zazwyczaj widok znajduje się wewnątrz widoku ViewControllera; Twój widok niestandardowy będzie miał dobrą, bezpieczną szansę na ułożenie swoich podglądów podrzędnych, gdy wywoła nadzór
layoutSubviews()
lubupdateConstraints()
. Te dwie funkcje są wywoływane przez system rekurencyjnie w całej hierarchii widoków. Możesz użyć alboupdateContstraints()
lublayoutSubviews()
.updateContstraints()
jest wtedy wywoływana jako pierwszalayoutSubviews()
. WupdateConstraints()
upewnij się, aby zadzwonić Super ostatni . WlayoutSubviews()
zadzwoń Super pierwszy .Oto co robię:
źródło
commonInit
metodzie, ale nie możesz ich umieścić później,super
ponieważ powinieneś zainicjować wszystkie właściwości PRZEDsuper
wywołaniem. Lol, wygląda na martwą pętlę.Oto jak to robię na iOS 9 w Swift -
Oto pełny projekt z przykładem:
źródło
super.init
, ale powiedział, że powinno to być zrobione przedsuper.init
...Oto, jak mogę zrobić podgląd podrzędny na iOS w Swift -
źródło