Angenommen, ich möchte init
eine UIView
Unterklasse mit einem String
und einem Int
.
Wie würde ich das in Swift machen, wenn ich nur eine Unterklasse habe UIView
? Wenn ich nur eine benutzerdefinierte init()
Funktion erstelle, die Parameter jedoch ein String und ein Int sind, wird mir mitgeteilt, dass "super.init () vor der Rückkehr vom Initialisierer nicht aufgerufen wird".
Und wenn ich anrufe, wird super.init()
mir gesagt, dass ich einen bestimmten Initialisierer verwenden muss. Was soll ich dort verwenden? Die Rahmenversion? Die Codiererversion? Beide? Warum?
quelle
var
. Die Standard-Best Practice in Swift besteht jedoch darin, Variablen zu deklarieren, eslet
sei denn, es gibt einen Grund, sie zu deklarierenvar
. In meinem obigen Codebeispiel gab es daher keinen solchen Grund dafürlet
.init(coder:)
.s
undi
optional, um die Dinge hier einfach zu halten. Wenn sie nicht optional wären, müssten sie auch im erforderlichen Initialisierer initialisiert werden. Wenn sie optional sind, werden sie angezeigt,nil
wenn siesuper.init()
aufgerufen werden. Wenn sie nicht optional wären, müssten sie tatsächlich zugewiesen werden, bevor super.init () aufgerufen wird.Ich erstelle eine gemeinsame Init für die vorgesehenen und erforderlichen. Der Einfachheit halber delegiere ich
init(frame:)
mit einem Rahmen von Null an.Ein Null-Frame ist kein Problem, da sich die Ansicht normalerweise in der Ansicht eines ViewControllers befindet. Ihre benutzerdefinierte Ansicht erhält eine gute und sichere Möglichkeit, ihre Unteransichten zu gestalten, wenn die Übersicht
layoutSubviews()
oderupdateConstraints()
. Diese beiden Funktionen werden vom System in der gesamten Ansichtshierarchie rekursiv aufgerufen. Sie können entwederupdateContstraints()
oder verwendenlayoutSubviews()
.updateContstraints()
wird dann zuerst aufgerufenlayoutSubviews()
. InupdateConstraints()
stellen Sie sicher, super zuletzt anzurufen . InlayoutSubviews()
rufe Super zuerst .Folgendes mache ich:
quelle
commonInit
Methode initialisieren möchten , diese abersuper
in diesem Fall nicht mehr platzieren können, da Sie alle Eigenschaften VOR demsuper
Aufruf initialisieren sollten . Lol es scheint wie eine tote Schleife.So mache ich es auf iOS 9 in Swift -
Hier ist ein vollständiges Projekt mit Beispiel:
quelle
super.init
, aber er sagte, es sollte vorher gemacht werdensuper.init
...Hier ist, wie ich eine Unteransicht auf iOS in Swift mache -
quelle