La modification de la rootViewController d'un UIWindow
Lorsque mon application se charge tout d'abord, j'ai mis le rootViewController
propriété de mon UIWindow
à controllerA
.
Au cours de mon application, j'ai choisi de changer le rootViewController
à controllerB
.
Le problème est que, parfois, quand je fais un flip de transition dans controllerB
, je vois controllerA
point de vue de derrière. Pour une raison que point de vue n'est pas supprimé. Ce qui est encore plus inquiétant, c'est qu'après le réglage de la rootViewController
à controllerB
, controllerA
's dealloc
méthode n'obtient jamais tiré.
J'ai essayé de supprimer les sous-vues de UIWindow
manuellement avant de passer à controllerB
, qui résout le problème de voir controllerA
's vues dans le fond, mais controllerA
's dealloc encore n'est jamais appelé. Ce qui se passe ici????
Pommes docs disent:
La vue racine contrôleur permet l'affichage du contenu de la fenêtre. L'affectation d'une vue contrôleur à cette propriété (par programmation ou en utilisant l'Interface Builder) installe le point de vue du contrôleur de vue que l'affichage du contenu de la fenêtre. Si la fenêtre a une vue existante de la hiérarchie, les vues anciennes sont supprimées avant les nouveaux sont installés.
Mise à JOUR
Voici le code de mon 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;
}
- Pouvez-vous fournir le code de votre
application:didFinishLaunchingWithOptions:
méthode dans votre délégué d'application? - Question stupide, mais ne vous réglez le
controllerA
à zéro lorsque vous poussez le second contrôleur? Si non, alors il ne sera pas dealloc. (Je suis en supposant que vous êtes) - Je n'ai jamais de garder un pointeur à controllerA donc pas sûr de ce que je serait fixé à néant.
- juste mis à jour à la question avec une version condensée de mon délégué d'application du code
Vous devez vous connecter pour publier un commentaire.
Il s'avère, il y a deux questions distinctes. 1) j'ai eu un cycle de conserver dans Un Contrôleur de sorte qu'il n'a jamais été prise en dealloc avais. Deuxièmement, afin de changer la vue de la racine de contrôleur, vous devez supprimer le windows des sous-vues en premier (même si les docs suggèrent le contraire)
Le problème pourrait être dans votre mise en œuvre de ControllerA ou ControllerB, ils peuvent conserver son " soi " dans le code afin de l'ARC cant automatiquement dealloc vous ViewController. Vous pouvez poster vous ControllerA et ControllerB mise en œuvre.
loginNavigationController = nil
C'est apple bug, nous supposons ViewControllerA que le courant de la rootViewController:
Si la réinitialisation de la fenêtre rootViewController que ce code, le ViewControllerA de vue ne sera jamais dealloc.