Как я могу удалить вид из контроллера навигации - PullRequest
11 голосов
/ 21 декабря 2011

Я хочу вызвать новый контроллер представления и удалить текущий контроллер представления из стека контроллера навигации.Например.Я имею ввиду контроллер A и вызываю B.

Теперь у меня в стеке A, B. Теперь я хочу вызвать C (из B).Я хочу, чтобы стек был A, C.

Спасибо.

Ответы [ 5 ]

23 голосов
/ 26 июня 2013

В контексте 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, а третья строка не будет работать.То же количество строк, что и в предыдущем примере, но этот способ работает через встроенные методы, а не «вручную» манипулирует стеком.

5 голосов
/ 22 декабря 2011

Это ответ.

Следующий код высвечивает текущий контроллер вида.

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

И это выдвигает новый:

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

Надеюсь, этопомогает!

4 голосов
/ 09 мая 2013

Чтобы удалить второй из последних элемент навигации:

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

Например, запустите его из viewDidLoad на контроллере C, чтобы удалить контроллер B из стека навигации.

0 голосов
/ 19 февраля 2015

Вы можете использовать этот код.

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

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

0 голосов
/ 21 декабря 2011

Я думаю, что вы можете сделать это, сначала вставив B из стека навигации, а затем вставив C в него.Вы должны быть в состоянии использовать [UINavigationController popViewControllerAnimated] и [UINavigationController pushViewController: animated] для этого.

...