Welche initializer (en) außer Kraft zu setzen für UITableViewController Unterklasse
-
09-09-2019 - |
Frage
Ich habe eine UITableViewController
Unterklasse, die instanziiert ist, je nachdem, wo es verwendet wird, in einem NIB oder über Code. In beiden Fällen möchte ich Anpassung in der Initialisierungsliste Methode zu tun. Bedeutet das, dass ich sowohl initWithNibName:bundle:
implementieren müssen und initWithCoder:
und würde jede Methode ihre jeweiligen Super initializer nennen?
Während ich dies nicht richtig brauche jetzt, was passiert, wenn ich möchte auch in der Lage sein, die View-Controller mit initWithStyle:
zu instanziiert? Würde ich dann müssen 3 verschiedene init Methoden, die das gleiche Verhalten nachzubilden?
Es scheint, wie dies die ganze bezeichnete initializer Konvention verletzt, da es im Wesentlichen 3 separater initializers sein würde, die eine gemeinsame init-Methode aufrufe nicht am Ende. Oder gibt es eine Möglichkeit, einen gemeinsamen bezeichnete initializer zu schaffen, während die 3 verschiedenen instantiate Routen unterstützen?
Lösung
Meine Verwirrung war auf dem falschen Glauben basiert, dass jede Klasse eine einzige bestimmte Initialisierung haben sollte. Das ist nicht wahr, und im Fall von UITableViewController
gibt es 3 bezeichnet initializers (soweit ich das beurteilen kann):
-
initWithStyle:
lokal deklariert -
initWithNibName:bundle:
vonUIViewController
geerbt -
initWithCoder:
von der AnnahmeNSCoding
Protokoll
Sie müssen außer Kraft setzen 1 oder mehr von diesen in der Unterklasse je nachdem, wie Sie Ihre Unterklasse wird instanziiert. In meinem Fall hatte ich # 2 und # 3, da die Klasse implementieren kann aus einem NIB geladen werden oder über Code mit Bezug auf einen NIB instanziiert. (Ich stelle mir es selten, dass Sie sowohl initWithStyle:
und initWithNibName:bundle:
für eine einzelne Klasse verwenden werden.)
Ich fand Apples Coding Richtlinien für Kakao hilfreich.
Andere Tipps
Intern
- UITableViewController des
-initWithStyle:
ruft die-init
Super dann die_tableViewStyle
Ivar gesetzt. - UIViewController des
-init
ruft einfach-initWithNibName:bundle:
mit Standardargumenten. - UITableViewController nicht Überschreibung
-initWithNibName:bundle:
.
Wenn Sie also -initWithNibName:bundle:
außer Kraft setzen, dann wird -initWithStyle:
die Änderung übernehmen zu. Natürlich, sicher zu spielen (wie Sie nicht auf Implementierungsdetails verlassen sollen), die beide außer Kraft setzen.
(Und keine Notwendigkeit, -initWithCoder:
außer Kraft setzen, es sei denn Sie un / die Instanzen zu archivieren.)
Um zu klären, initWithStyle:
, UITableViewController
einzigem veröffentlicht initializer in der Dokumentation zu sein, ist seine eine ausdrückliche bezeichnet initializer.
initWithNibName:bundle:
von UIViewController geerbt und ist der designierte initializer für diese Klasse. Als solche gemäß Cocoa Richtlinien, UITableViewController
muss diese Methode überschreiben (durch Implementierung). Allerdings bedeutet dies nicht, dass es eine designierte initializer von UITableViewController
machen.
initWithCoder:
ist, wie Sie darauf hinweisen, eine implizite bestimmte Initialisierung von NSCoding
.
Implementieren Sie:
- (void) viewDidLoad
und tun Sie Ihre Komponente Initialisierung gibt.
Es hat den Vorteil, nur tun, um die Initialisierung, wenn die Ansicht tatsächlich angefordert wird.
Oder nur eine separate Setup-Methode von allen initializers aufgerufen werden.
Eine Ergänzung zu den Pfosten oberhalb dieser Referenz -initWithCoder:
Wenn Sie die View-Controller an ihrer Mutter über Interface Builder hinzugefügt hinzugefügt (zum Beispiel: Wenn die View-Controller auf eine Tab-Leiste Controller in Interface Builder angeschlossen ist), dann müssen Sie -initWithCoder außer Kraft zu setzen
.(-. InitWithNibName wird nur aufgerufen werden, wenn Sie die View-Controller programmatisch erstellen)