2010-08-24 10 views
7

El programa tiene una barra de navegación y, normalmente, al hacer clic en un botón en viewController1 va a viewController2. al hacer clic en un botón en viewController2 va a viewController3. y el usuario puede navegar de viewController3 a viewController2 y luego a viewController1 usando el botón Atrás en la barra de navegación.Salte al siguiente controlador con UINavigationController en iPhone

Quiero hacer un botón que programáticamente lleva al usuario directamente a viewController3 desde viewController1. luego el usuario puede navegar de viewController3 a viewController2 para verController1.

¿Hay alguna manera de introducir dos vistas en el controlador de navegación? o es otra forma de lograr el comportamiento deseado? ¿cómo debería diseñar esto?

Respuesta

9

Lo siento por malinterpretar su pregunta. Porque desea presionar 2 ver controlador y luego volver 1 por 1. Creo que la solución ahora es simple.

Sólo tiene que empujar vista del controlador de 2 veces, 1 sin animación y 1 con la animación de la siguiente manera:

[viewController1.navigationController pushViewController:viewController2 animated:NO]; 
[viewController2.navigationController pushViewController:viewController3 animated:YES]; 

Por lo tanto, para el usuario, sucede como si sólo se presiona 1, pero detrás de la escena, en realidad empujas 2 controladores de vista. Luego, cuando desee volver, solo necesita mostrar 1 por 1.

+0

donde pondría popToViewController? en viewcontroller1 o viewcontroller2 – Yazzmi

+0

en viewcontroller 3, cuando maneja la acción del botón. – vodkhang

+0

dijiste "Apaga los controladores de vista hasta que el controlador de vista especificado se encuentre en la parte superior de la pila de navegación". donde especificas el controlador de vista? – Yazzmi

0

Es posible presionar 2 controladores de visualización a la vez, pero una vez que presione el primero, la propiedad navigationController en el ViewController actual será nula, ya que ya no está en la parte superior de la pila, por lo que tendrá que hacer una referencia a ella. Nunca he tratado de presionar 2 a la vez con animaciones, no estoy seguro de cómo se vería eso.

+0

en realidad, realmente no necesito mostrar viewController2 solo quiero asegurarme de poder volver a viewController2. 3-> 2-> 1 – Yazzmi

+0

Tiene que empujarlo en la pila de controladores de navegación en algún momento. – skorulis

+0

Si empuja dos controladores, el primero que se presione absolutamente NO se convertirá en ni porque los controladores de navegación todavía tienen una referencia en la pila de controladores empujados. – imaginaryboy

4

Puede establecer directamente la pila de navegación en un UINavigationController usando. setViewControllers:animated:.

Por ejemplo, suponiendo que el código está en algún lugar viewController1 como el controlador para una pulsación de botón en su vista:

NSMutableArray* viewControllers = [self.navigationController.viewControllers mutableCopy]; 
UIViewController* controller = [[MyViewController2 alloc] init]; 
[viewControllers addObject:controller]; 
[controller release]; 
controller = [[MyViewController3 alloc] init]; 
[viewControllers addObject:controller]; 
[controller release]; 
[self.navigationController setViewControllers:viewControllers animated:YES]; 

La creación de empresas en la parte superior de eso con la llamada mutableCopy es por lo que eres preservando lo que ya está en la pila de navegación.

+0

¿necesitas liberar ViewControllers? ¿si es así, donde? thx – Yazzmi

+0

El lugar donde los publica probablemente dependa de dónde los retuvo o asignó.Si no necesita una referencia por separado para ellos, puede liberarlos tan pronto como los haya insertado en la matriz como lo hice en el código de ejemplo anterior. – imaginaryboy

+0

Esta es la forma adecuada de hacer lo que la pregunta plantea. Empujar un controlador de vista sin animación e inmediatamente otro con animación es frágil. Funcionó para mí (en iOS 7) pero se rompió recientemente (en iOS 8). –

Cuestiones relacionadas