11

Quiero llamar a un nuevo controlador de vista y quitar el controlador de vista actual de la pila del controlador de navegación. Por ejemplo. Estoy en el controlador de vista A y llamo B.Cómo puedo eliminar una vista del controlador de navegación

Ahora tengo en la pila A, B. Ahora quiero llamar a C (desde B). Quiero que la pila sea A, C.

Gracias.

Respuesta

5

Esta es la respuesta.

El siguiente código muestra el controlador de vista actual.

UINavigationController *navController = self.navigationController; 
// retain ourselves so that the controller will still exist once it's popped off 
[[self retain] autorelease]; 
[navController popViewControllerAnimated:NO]; 

Y esto empuja el nuevo:

ViewControllerC *viewC = [[ViewControllerC alloc] init]; 
[navController pushViewController:viewC animated:TRUE]; 

espero que ayude!

+2

¿Alguna idea de cómo hacer esto con ARC habilitado? El compilador no permite el uso de 'retener' – asdasd

+1

@Oscar, vea mi solución, [abajo] (http://stackoverflow.com/a/17328244/1431728). – JohnK

0

Creo que puedes hacer esto sacando primero B de la pila de navegación y luego presionando C en él. Debería poder usar [UINavigationController popViewControllerAnimated] y [UINavigationController pushViewController: animated] para esto.

+0

Esto es correcto pero no completo. Finalmente funcionó, pero tengo que retener el controlador antes de abrirlo, para poder enviar la otra vista después. UINavigationController * navController = self.navigationController; [[auto retención] liberación automática]; [navController popViewControllerAnimated: NO]; – Tony

+0

De acuerdo con la referencia de Apple, http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html UINavigationController no está destinado a ser subclasificado. ¿Por qué algo tan simple es tan complicado? – Tony

+0

@Tony Mi mal, me olvidé de eso. Ignora mi comentario anterior y edítalo. Los eliminaré todos ... – barley

4

Para retirar la segunda-from-último elemento de navegación:

NSMutableArray *navigationStack = [[NSMutableArray alloc] initWithArray: 
    self.navigationController.viewControllers]; 
[navigationStack removeObjectAtIndex:[navigationStack count] - 2]; 
self.navigationController.viewControllers = navigationStack; 

Por ejemplo, ejecute esto desde viewDidLoad en el controlador C para eliminar el controlador B de la pila de navegación.

23

En el contexto de la ARC, he aquí una solución posible:

NSMutableArray* navArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
[navArray replaceObjectAtIndex:[navArray count]-1 withObject:nextViewController]; 
[self.navigationController setViewControllers:navArray animated:YES]; 

Como se puede ver, este código reemplaza el código de empuje habitual en la vista que se está tratando de eliminar de la pila ("B" en tu pregunta). La línea 1 copia la lista de controladores de vista de la pila del controlador de navegación en un NSMutableArray. La línea 2 reemplaza la última vista (más arriba) con la vista a la que queremos ir ("C"). La línea 3 hace que la pila del controlador de navegación real sea nuestra matriz alterada y anima la transición al elemento superior. (Por supuesto, no se puede utilizar este código en el viewController raíz.)

he encontrado una forma alternativa here y lo adaptó para el ARC:

UINavigationController *navController = self.navigationController; 
[navController popViewControllerAnimated:NO]; 
[navController pushViewController:someViewController animated:YES]; 

La primera línea es necesario porque una vez que haya hecho estallar la vista actual fuera de la pila, self.navigationController será nil y la tercera línea no funcionará. El mismo número de líneas que en la forma anterior, pero de esta manera funciona a través de métodos integrados en lugar de manipular "manualmente" la pila.

+0

Gracias su segunda implementación fue exactamente lo que estaba buscando. – NMunro

+0

gracias, la explicación es excelente! – Michael

-2

Puede usar este código.

NSMutableArray * navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers]; [navigationArray removeAllObjects]; self.navigationController.viewControllers = navigationArray;

Espero que funcione para usted.

Cuestiones relacionadas