Warum verursacht dieser andere "addSubView" -Code Unterschiede im Verhalten?

8

Warum behebt das Ändern des folgenden Codes von dem Alten zu dem Neu-Eintrag das folgende Problem.

Code:

%Vor%

Problem, wenn ich alten Code verwende:

  • Ich benutze einen UINavigationController und habe einen "mainView" UITableViewController und dann eine 2nd Level Ansicht, die ich auf den Stack drücke, nennen wir es "detailview" UITableViewController.

  • Das normale Zurück- und Vorrücken von der Hauptansicht zu den Details funktioniert einwandfrei

  • ABER wenn automatisch beim Start in die 2. Ansicht gestartet wird (wenn ich den Status speichere), komme ich zur 2. Ansicht OK, aber die TOOLBAR-TASTEN erscheinen in diesem Fall NICHT unten in der 2. Ansicht. Wenn ich zurück zur Hauptseite gehe (über UINavigationController Standard-Anordnungen), und dann die Zeile in der UITableView auswählen und wieder in die gleiche Ansicht zurückkehren, erscheinen die Toolbar-Elemente in Ordnung.

  • Konnte das nicht nachverfolgen, aber schließlich habe ich durch Versuch und Irrtum festgestellt, dass diese Änderung im Code (siehe oben) in der appDelegate (von allen Stellen) das Problem zu beheben scheint.

Irgendwelche Ideen?

EDIT: Zur Vollständigkeit hier ist die vollständige Methode

%Vor%

BEARBEITEN SIE 2: Oh, ich habe eine NIB-Datei und die Root-Ansicht Controller / Fenster-Setup im Interface Builder - also frage ich mich, ob ich eine NIB und programmatische Vorgehensweise hier vielleicht mischen, die Probleme verursachen könnte?

EDIT 3: Beachten Sie außerdem, dass der folgende didFinishLaunchingWithOptions-Code funktionierte, wenn ich die Zeile "self.window.rootViewController = self.navigationController" hinzufügte. Das ist ohne diese Zeile (was das Beispiel der coredatabooks tut) Ich bekomme das Problem.

%Vor%     
Greg 21.04.2011, 23:12
quelle

1 Antwort

6

Der Unterschied zwischen den beiden Methoden besteht darin, dass man die View-Lifecycle-Methoden nicht mit der anderen Dosis auslöst.

i.e. Die Einstellung window.rootViewController bewirkt, dass der alte View-Controller die Nachrichten empfängt: viewDidDisaper viewWillDissapear etc .. während der neue View-Controller den viewWillApear, viewDidAppear usw. empfängt.

addSubview: tut dies nicht.

Hilft das?

BEARBEITEN:

Wenn Sie Ihren Beitrag im Detail lesen, sieht es so aus, als würden Sie die Schaltflächen programmatisch in der Methode viewDidAppear der Detailansicht hinzufügen.

Die rootViewController Eigenschaft von UIWindow wurde ab 4.0 hinzugefügt. Die Dokumentation erwähnt nicht explizit, dass es die View-Life-Cycle-Methoden auslösen wird, ich habe es durch Trail-and-Error herausgefunden wie Sie selbst. (vielleicht kann jemand ein Problem gegen die Apple-Dokumentation aufwerfen).

Wenn Sie für 3.x abwärtskompatibel sein müssen, können Sie eine benutzerdefinierte UIWindow-Unterklasse verwenden. Mein Code ist unten. Verwenden Sie window.djRootViewController = yourViewController anstelle von window.rootViewController . Es wurde für den Builder für Schnittstellen entwickelt.

%Vor%     
Robert 22.04.2011, 18:07
quelle