我有一个UINavigationController
,上面有一系列UIViewControllers
。在某些情况下,我想要回弹两个级别。我以为我可以通过连续两次调用popViewControllerAnimated
来做到这一点,但事实证明我第二次调用它时,它不会弹出任何东西而是返回NULL。我是否需要存储对目标VC的引用并调用popToViewControllerAnimated?我可以这样做,但它使我的代码变得复杂,因为当我将VC推入堆栈时,我必须传递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
或其他完全的东西,我会很乐意改变它。
答案 0 :(得分:67)
在这种情况下,你需要弹回一个navigationController中的特定视图控制器,如下所示:
[self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:2] animated:YES];
该代码将弹出到navigationController堆栈上的第三个viewcontroller。
答案 1 :(得分:19)
我认为最好计算堆栈中的视图控制器数量,然后减去要弹出的视图控制器的数量。
NSInteger noOfViewControllers = [self.navigationController.viewControllers count];
[self.navigationController
popToViewController:[self.navigationController.viewControllers
objectAtIndex:(noOfViewControllers-2)] animated:YES];
使用此解决方案,如果稍后向项目添加新视图,则不会弄乱pop。
答案 2 :(得分:2)
如果您保存对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.
}
答案 3 :(得分:1)
另外,至于你做错了什么,我相信[self.navigationController popViewControllerAnimated:YES]
第二次没有工作的原因是因为你可能在第一次通话时弹出的第二个电话。第一次调用后,当前视图将从导航控制器中删除,因此当您进行第二次调用时,self.navigationController
将返回nil,因为它不再具有导航控制器。