Подтвердить что ты не робот

Вызов popViewControllerAnimated дважды

У меня есть UINavigationController с серией UIViewControllers на нем. В некоторых случаях я хочу вернуться ровно на два уровня. Я думал, что могу сделать это, дважды позвонив popViewControllerAnimated, но оказывается, что во второй раз я его вызываю, он ничего не выскакивает и вместо этого возвращает NULL. Нужно ли хранить ссылку на мой пункт назначения VC и вместо этого вызывать popToViewControllerAnimated? Я могу это сделать, но это усложняет мой код, так как мне придется проходить UIViewController *, поскольку я нажимаю VC на стек.

Вот соответствующий фрагмент:

UIViewController* one = [self.navigationController popViewControllerAnimated:YES];
if (...) {
    // pop twice if we were doing XYZ
    UIViewController *two = [self.navigationController popViewControllerAnimated:YES];
    // stored in "one" and "two" for debugging, "two" is always 0 here.
}

Я делаю что-то странное здесь? Я хочу написать идиоматический код, поэтому, если "правильным" способом является вызов popToViewControllerAnimated или что-то еще, я с радостью изменю его.

4b9b3361

Ответ 1

В этом случае вам нужно будет вернуться к определенному диспетчеру просмотра в navigationController, например:

[self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:2] animated:YES];

Этот код появится в третьем диспетчере представлений в стеке navigationController.

Ответ 2

Я думаю, что лучше подсчитать количество контроллеров представлений в вашем стеке, а затем вычесть количество контроллеров просмотра, которые вы хотели бы поп.

 NSInteger noOfViewControllers = [self.navigationController.viewControllers count];
 [self.navigationController 
 popToViewController:[self.navigationController.viewControllers 
 objectAtIndex:(noOfViewControllers-2)] animated:YES];

С помощью этого решения вы не испортите поп, если позже добавите новое представление в свой проект.

Ответ 3

Он работает для меня, если вы сохраните ссылку на UINavigationViewController и используйте сохраненный экземпляр:

UINavigationViewController* savedUinvc = self.navigationController;
UIViewController* one = [savedUinvc  popViewControllerAnimated:YES];
if (...) {
    // pop twice if we were doing XYZ
    UIViewController *two = [savedUinvc  popViewControllerAnimated:YES];
    // stored in "one" and "two" for debugging, "two" is always 0 here.
}

Ответ 4

Кроме того, что касается того, что вы делаете неправильно, я считаю, что причина, по которой [self.navigationController popViewControllerAnimated:YES] не работает во второй раз, заключается в том, что вы, вероятно, делаете этот второй вызов на экране, который вызывается при первом вызове. После первого вызова текущий вид удаляется из навигационного контроллера, поэтому к моменту второго вызова self.navigationController будет возвращать нуль, поскольку он больше не имеет навигационного контроллера.