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?

War es hilfreich?

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):

  1. initWithStyle: lokal deklariert
  2. initWithNibName:bundle: von UIViewController geerbt
  3. initWithCoder: von der Annahme NSCoding 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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top