2013-07-13 16 views
23

Wenn meine App zuerst geladen wird, setze ich die rootViewController Eigenschaft meines UIWindow auf controllerA.Ändern des rootViewControllers eines UIWindow

Irgendwann während meiner App, ich ändere die rootViewController zu controllerB.

Das Problem ist, dass manchmal, wenn ich einen Flip-Übergang in controllerB mache, sehe ich controllerA 's Blick dahinter. Aus irgendeinem Grund wird diese Ansicht nicht entfernt. Was noch beunruhigender ist, ist, dass nach dem Setzen der rootViewController auf controllerB, controllerAdealloc Methode nie ausgelöst wird.

Ich habe versucht, die Subviews von UIWindow manuell zu entfernen, bevor zu controllerB Schalten, löst das Problem dadurch zu sehen controllerA ‚s Ansichten im Hintergrund, aber controllerA‘ s dealloc noch wird nie genannt. Was geht hier vor ????

Äpfel docs sagen:

Der Root-View-Controller stellt des Fensters die Inhaltsansicht. Durch Zuweisen eines Ansichtscontrollers zu dieser Eigenschaft (entweder programmgesteuert oder mithilfe von Interface Builder) wird die Ansicht des Ansichtscontrollers als Inhaltsansicht des Fensters installiert. Wenn das Fenster eine vorhandene Ansichtshierarchie aufweist, werden die alten Ansichten entfernt, bevor die neuen Ansichten installiert werden.

UPDATE

Hier ist der Code meiner AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [self showControllerA]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (void)showControllerA 
{ 
    ControllerA* a = [ControllerA new]; 
    self.window.rootViewController = a; 
} 

- (void) showControllerB { 
    ControllerB* b = [ControllerB new]; 
    self.window.rootViewController = b; 
} 
+0

Können Sie den Code für Ihre 'application: didFinishLaunchingWithOptions:' -Methode in Ihrem App-Delegaten bereitstellen? – Cezar

+0

Dumme Frage, aber setzen Sie den 'ControllerA' auf Null, wenn Sie den zweiten Controller drücken? Wenn nicht, wird es nicht freigegeben. (Ich nehme an, Sie sind) – Putz1103

+0

Ich halte nie einen Zeiger auf ControllerA so nicht sicher, was ich auf Null setzen würde. – aloo

Antwort

11

Es stellt sich heraus, dass es zwei separate Probleme gibt. 1) Ich hatte einen Behalten Zyklus in Controller A, so dass es nie freigegeben wurde. Zweitens müssen Sie, um den RootView-Controller zu ändern, zuerst die Windows-Subviews entfernen (auch wenn die Dokumentation dies anders vermuten lässt)

1

Das Problem bei der Implementierung von ControllerA oder ControllerB sein könnte, können sie so ARC 'Selbst' im Code beibehalten kann den ViewController nicht automatisch aufheben. Können Sie Ihre ControllerA- und ControllerB-Implementierung veröffentlichen?

+0

Das würde erklären, warum dealloc nicht aufgerufen wird. Aber warum sollte die Ansicht von controllerA immer noch hinter controllerB sichtbar sein? Wenn Sie den Root-View-Controller nicht ändern, entfernen Sie die Ansichten von ControllerA aus dem Fenster. – aloo