Ir a la primera vista del controller en la aplicación

Necesito ir a la primera vista en mi aplicación. Tengo algunas vistas insertadas en el astackmiento, luego un controller de navigation modal y más vistas insertadas en eso.

El problema que estoy teniendo es que usando [[self navigationController] popToRootViewControllerAnimated:YES]; Solo se remonta a la primera vista en la stack modal.

Y no puedo hacer que [[self navigationController] popToViewController:.. funcione porque el verdadero controller de la primera vista no es accesible con [[self navigationController] viewControllers] .

¿Alguna idea sobre cómo lograr esto? Gracias.

Hacer esto:

 [[self navigationController] dismissModalViewControllerAnimated:YES]; 

Eso lo llevará de vuelta al VC que presentó el controller de navigation. Obtener más atrás después de eso dependerá de cómo haya empujado esas "pocas vistas" antes del controller de navigation.

Editar : explicación para llegar a la raíz más profunda …

Parece que esas "pocas vistas" están en otra stack subyacente del controller de navigation. Esto puede ser un poco complicado, porque la forma más limpia de volver a estar en esa stack es hacer que el controller de navigation subyacente aparezca en su propia raíz. ¿Pero cómo puede saber que el VC modal encima de él se hace?

Llamemos al controller de vista que hizo la presentación modal del segundo controller de navigation VC_a. Es un controller de navigation presentado de manera práctica cuyo VC superior es VC_b. ¿Cómo puede VC_a saber cómo llegar a su raíz de navigation cuando VC_b se despoja de manera modal?

La buena respuesta (por lo general) es que VC_b decidió desestimarse por una razón: se modificó alguna condición de su aplicación / model para que se decidiera.

Queremos que VC_a también detecte esta condición. Cuando VC_b es descartado, y VC_a recibe un post de vista, aparecerá porque está a punto de ser descubierto:

 // VC_a.m - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (/* some app condition that's true when VC_b is done */) { // I must be appearing because VC_b is done, and I'm being uncovenetworking // That means I'm done, too. So pop... [self.navigationController popToRootViewControllerAnimated:NO]; } else { // I must be appearing for the normal reason, because I was just pushed onto the stack } } 

Debe hacerlo utilizando el patrón de delegación . Específicamente, mediante la creación de un protocolo que implementa el método del respondsToSelector del delegado.

Vea esta publicación para get detalles completos. Debe ser casi exactamente lo que está buscando. Tuve que hacer algo similar, excepto que solo necesitaba abrir una vista de la stack de navigation en lugar de usar popToRootViewControllerAnimated:

Para iOS6 …

 [self.view.window.rootViewController dismissViewControllerAnimated:YES completion:nil]; 

En AppDelegate.m class create method con flujo bajo …

 -(void)MethodName{//your method name YourViewController *objViewController = [[[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil] autorelease]; ///define your viewcontroller name like "FirstViewController" UINavigationController *yourNavigationController = [[[UINavigationController alloc] initWithRootViewController:objViewController] autorelease]; self.window.rootViewController = yourNavigationController; } 

Cuando desee networkingirigir en primera vista, simplemente llame a este método desde el object appdelegate …