Как удалить вид из навигационного контроллера
Я хочу вызвать новый контроллер представления и удалить текущий контроллер представления из стека контроллера навигации.
Например. Я наблюдаю за контроллером A и я вызываю B.
Теперь у меня в стеке A, B.
Теперь я хочу позвонить C (из B).
Я хочу, чтобы стек был A, C.
Спасибо.
Ответы
Ответ 1
Это ответ.
Следующий код выдает текущий контроллер.
UINavigationController *navController = self.navigationController;
// retain ourselves so that the controller will still exist once it popped off
[[self retain] autorelease];
[navController popViewControllerAnimated:NO];
И это подталкивает новый:
ViewControllerC *viewC = [[ViewControllerC alloc] init];
[navController pushViewController:viewC animated:TRUE];
Надеюсь, что это поможет!
Ответ 2
В контексте 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 копирует список контроллеров представлений из стека контроллера навигатора в NSMutableArray
. Строка 2 заменяет последнее (верхнее) представление видом, который мы хотим перейти к следующему ( "C" ). Строка 3 делает фактический стек навигационного контроллера нашим измененным массивом и анимирует переход к самому верхнему элементу. (Конечно, вы не можете использовать этот код в корневом viewController.)
Я нашел альтернативный способ здесь и адаптировал его для ARC:
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:someViewController animated:YES];
Первая строка нужна, потому что, как только вы вытащили текущее представление из стека, self.navigationController
будет nil
, а третья строка не будет работать. То же количество строк, что и предыдущий, но этот способ работает через встроенные методы, а не "вручную" возиться со стеком.
Ответ 3
Чтобы удалить второй пункт навигации:
NSMutableArray *navigationStack = [[NSMutableArray alloc] initWithArray:
self.navigationController.viewControllers];
[navigationStack removeObjectAtIndex:[navigationStack count] - 2];
self.navigationController.viewControllers = navigationStack;
Например, запустите это из viewDidLoad
на контроллере C, чтобы удалить контроллер B из стека навигации.
Ответ 4
Я думаю, вы можете сделать это, сначала выталкивая B из стека навигации, а затем вставляя C в него. Для этого вы должны использовать [UINavigationController popViewControllerAnimated] и [UINavigationController pushViewController: анимированные].
Ответ 5
Вы можете использовать этот код.
NSMutableArray * navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers];
[navigationArray removeAllObjects]; Автопортрет.
Надеюсь, что это сработает для вас.