Как удалить вид из навигационного контроллера

Я хочу вызвать новый контроллер представления и удалить текущий контроллер представления из стека контроллера навигации. Например. Я наблюдаю за контроллером 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]; Автопортрет.

Надеюсь, что это сработает для вас.