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.
¿Alguna idea de cómo hacer esto con ARC habilitado? El compilador no permite el uso de 'retener' – asdasd
@Oscar, vea mi solución, [abajo] (http://stackoverflow.com/a/17328244/1431728). – JohnK