В контексте ARC вот возможное решение:
NSMutableArray* navArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
[navArray replaceObjectAtIndex:[navArray count]-1 withObject:nextViewController];
[self.navigationController setViewControllers:navArray animated:YES];
Как вы можете сказать, этот код заменяет обычный push-код в представлении, которое вы пытаетесь удалить из стека ("B,в вашем вопросе).Строка 1 копирует список контроллеров представления из стека nav-controller в NSMutableArray
.Строка 2 заменяет последнее (самое верхнее) представление видом, к которому мы хотим перейти далее («C»).Строка 3 делает фактический стек nav-контроллера нашим измененным массивом и оживляет переход к самому верхнему элементу.(Конечно, вы не можете использовать этот код в корневом viewController.)
Я нашел альтернативный способ здесь и адаптировал его для ARC:
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:someViewController animated:YES];
первая строка необходима, потому что как только вы вытолкнули текущий вид из стека, self.navigationController
будет nil
, а третья строка не будет работать.То же количество строк, что и в предыдущем примере, но этот способ работает через встроенные методы, а не «вручную» манипулирует стеком.