Cómo controlar dealloc uiviewcontroller / download vistas en la acción de cierre de session

Creo que esta es una uscase bastante común como la he visto en varias aplicaciones. Pero después de pasar un par de días, todavía estoy luchando con esto. Tengo una estructura como la siguiente:

UITabBarController -- UINavigationController1 ---- UITableViewController1 -- UINavigationController2 ---- UITableViewController2 

Ahora tengo un button de cierre de session en UITableViewController2. Cuando hago clic en ese button de cierre de session quiero que se desasigne todo y cualquier control de vista, todas las vistas se descargan. Básicamente comienza de cero como iniciar la aplicación. Básicamente quiero que se vuelva a llamar a viewDidLoad en cada uno de esos UITableViewController.

Probé el siguiente método para llamar en mi appdelegate cuando se toma la acción de cierre de session en UITableViewController2.

 -(void) logout { for (UINavigationController* ctrl in self.tabBarController.viewControllers) { [ctrl popToRootViewControllerAnimated:NO]; ctrl.visibleViewController.view = nil; } [self.tabBarController.view removeFromSuperview]; [self.window addSubview:self.tabBarController.view]; 

}

Pero, por desgracia, no parece funcionar?

¿Alguna idea de cómo se logra tal cosa? También veo comportamientos diferentes en iOS4 vs iOS5 con visibleViewController. No estoy usando ningún controller de vista modal aquí. ¿Alguna gotchas?

Actualización: no estoy usando ARC

gracias mbh

Su for-loop liberará y, por lo tanto, desasignará todos los controlleres de vista que haya presionado a las respectivas raíces de UINavigationController (dependiendo de cuántas tabs tenga), es decir, ya que no tendrán una supervisión al volver a la raíz de cada controller de navigation , estos se eliminan automáticamente. Estos son sus supervisores UITableViewControllers.

En cuanto a los controlleres UINavigation respectivos, necesitará su controller de barra de tabs para liberar la instancia anterior. En mi humilde opinión, esto debe hacerse por ti cuando lanzas el UITabBarController.

Esto deja el UITabBarController mismo. No creo que se pueda hacer tbh. Su código solo eliminará la vista, pero no afectará al controller de la barra de tabs. Y como señala Krishna K, necesita al less un controller de vista para volver a cargar todos los demás. Poner el código en el appdelegate tiene sentido, pero debe asegurarse de que su cierre de session () no provocará una retención en el UITableViewController2 así como en el UITabbarController como se llama desde UITableViewController2 en alguna parte.

Una idea para explorar, ¿su AppDelegate tiene una instancia para el TabBar-Controller que podría lanzar y crear una nueva instancia después de eliminar la vista de self.window?

 // manually create UITabBarController - AppDelegate holds instance - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { mytabcontroller=[[UITabBarController alloc] initWithNibName:@"foo" bundle:nil]; } - (void) logout { [self.tabBarController.view removeFromSuperview]; [mytabcontroller release]; mytabcontroller=[[UITabBarController alloc] initWithNibName:@"foo" bundle:nil]; [self.window addSubview:self.tabBarController.view]; } 

Pero como dije, puede haber advertencias con gestión de la memory en este momento.

Necesita liberar sus controlleres de vista. Cuando se invoca su método de lanzamiento, ese método debe include instrucciones para liberar todos los resources de su object (y también su superclass dealloc).

Su rootViewController para ambos controlleres de navigation son sus respectivos controlleres TableView. Entonces, no creo que popToRootViewController haría nada.

Probablemente necesite restablecer los datos y actualizar las vistas en lugar de desasignar las vistas.