2013-07-13 10 views
23

Po załadowaniu mojej aplikacji ustawię właściwość rootViewController mojego UIWindow na controllerA.Zmiana obiektu rootViewController w UIWindow

Kiedyś podczas mojej aplikacji wybrałem zmianę rootViewController na controllerB.

Problem polega na tym, że czasami, gdy wykonuję zmianę przejścia w widoku controllerB, widzę za nią widok controllerA. Z jakiegoś powodu widok ten nie jest usuwany. Co jeszcze bardziej niepokojące jest to, że po ustawieniu metody nigdy nie zostanie wywołana.

Próbowałem usuwanie subviews z UIWindow ręcznie przed włączeniem do controllerB, który rozwiązuje ten problem widząc controllerA „s widoki w tle, ale controllerA” dealloc wciąż nigdy nie jest wywoływana. Co tu się dzieje ????

Jabłka docs powiedzieć:

Korzeń widok kontroler zapewnia widok zawartość okna. Przypisanie kontrolera widoku do tej właściwości (programowo lub przy użyciu Kreatora interfejsu) powoduje zainstalowanie widoku kontrolera widoku jako widoku zawartości okna. Jeśli okno ma istniejącą hierarchię widoku, stare widoki są usuwane przed instalacją nowych.

UPDATE

Oto kod mojego 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

Czy możesz podać kod dla metody 'application: didFinishLaunchingWithOptions:' w delegacie aplikacji? – Cezar

+0

Głupie pytanie, ale czy ustawiasz 'controllerA' na zero, kiedy naciskasz drugi kontroler? Jeśli nie, to nie zwolni. (Zakładam, że jesteś) – Putz1103

+0

Nigdy nie trzymam wskaźnika na kontrolerze, więc nie jestem pewien, co ustawiłbym na zero. – aloo

Odpowiedz

11

Okazuje się, że istnieją dwa osobne problemy. 1) Miałem cykl zatrzymania w kontrolerze A, więc nigdy nie doszło do dealloc'd. Po drugie, aby zmienić kontroler widoku root, musisz najpierw usunąć subviews systemu Windows (mimo że dokumenty sugerują inaczej).

1

Problem może być w realizacji ControllerA lub ControllerB, mogą zachować 'ja' w kodzie tak ARC Nie mogę automatycznie zwolnić użytkownika ViewController. Czy możesz opublikować implementację ControllerA i ControllerB?

+0

To by wyjaśniało, dlaczego dealloc nie jest wywoływany. Ale dlaczego widok z kontrolera A byłby nadal widoczny za sterownikiem B? Czy zmiana kontrolera widoku głównego nie powoduje usunięcia widoków kontrolera z okna? – aloo

Powiązane problemy