ios uiviewcontroller uiwindow rootview

ios - Cambiando el rootViewController de una UIWindow



uiviewcontroller (3)

Cuando mi aplicación se carga por primera vez, configuro la propiedad rootViewController de mi UIWindow a controllerA .

En algún momento durante mi aplicación, elijo cambiar el rootViewController de rootViewController a controllerB .

El problema es que a veces cuando hago una transición de giro en el controllerB , veo la vista del controllerA detrás. Por alguna razón, esa vista no se está eliminando. Lo que es aún más preocupante es que después de configurar rootViewController en controllerB , el método dealloc nunca se dealloc .

He intentado eliminar las subvistas de UIWindow manualmente antes de cambiar a controllerB , que resuelve el problema de ver las vistas del controllerA en segundo plano, pero el dealloc de controllerA nunca se llama. ¿¿¿¿Que está pasando aqui????

Las manzanas dicen:

El controlador de vista raíz proporciona la vista de contenido de la ventana. La asignación de un controlador de vista a esta propiedad (ya sea mediante programación o utilizando Interface Builder) instala la vista del controlador de vista como la vista de contenido de la ventana. Si la ventana tiene una jerarquía de vistas existente, las vistas anteriores se eliminan antes de que se instalen las nuevas.

ACTUALIZAR

Aquí está el código de mi 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; }


El problema podría estar en su implementación de ControllerA o ControllerB, pueden retener ''self'' en el código para que ARC no pueda desasignar automáticamente a ViewController. ¿Puedes publicar tu ControllerA y la implementación de ControllerB?


Resulta que hay dos cuestiones separadas. 1) Tuve un ciclo de retención en el Controlador A, por lo que nunca fue desasignado. En segundo lugar, para cambiar el controlador de vista raíz, primero debe eliminar las subvistas de Windows (aunque los documentos sugieren lo contrario)


var loginNavigationController: OnBoardViewController?{ willSet{ if newValue == nil { loginNavigationController?.view.removeFromSuperview() } } }

loginNavigationController = nil