Вызов popViewControllerAnimated дважды - PullRequest
26 голосов
/ 14 июля 2009

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

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

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, или что-то еще, я с радостью его поменяю.

Ответы [ 4 ]

68 голосов
/ 14 июля 2009

В этом случае вам нужно будет вернуться к определенному контроллеру представления в навигационном контроллере следующим образом:

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

Этот код появится в третьем контроллере представления в стеке навигационного контроллера.

19 голосов
/ 15 сентября 2011

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

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

С этим решением вы не испортите поп-музыку, если позже добавите новый вид в ваш проект.

2 голосов
/ 13 июля 2013

У меня работает, если вы сохраните ссылку на 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.
}
1 голос
/ 22 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...