28

我有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,或者完全是其他方式,我会很乐意改变它。

4

4 回答 4

73

在这种情况下,您需要像这样弹出导航控制器中的特定视图控制器:

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

该代码将弹出到导航控制器堆栈上的第三个视图控制器。

于 2009-07-14T01:16:44.473 回答
21

我认为最好计算堆栈中的视图控制器的数量,然后减去你想要弹出的视图控制器的数量。

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

使用此解决方案,如果您稍后向项目添加新视图,您将不会弄乱弹出窗口。

于 2011-09-15T15:13:45.720 回答
2

It works for me if you save the reference to the UINavigationViewController and use the saved instance:

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.
}
于 2013-07-13T02:44:26.570 回答
1

另外,至于您做错了什么,我相信[self.navigationController popViewControllerAnimated:YES]第二次无法正常工作的原因是因为您可能在第一次通话时弹出的屏幕上进行了第二次通话。第一次调用后,当前视图从导航控制器中移除,所以当你进行第二次调用时,self.navigationController将返回 nil,因为它不再有导航控制器。

于 2011-09-22T15:35:53.717 回答