我有一个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
,或别的东西完全,我会高兴地改变它。
在这种情况下,你需要弹出回在navigationController像这样一个特定的ViewController:
[self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:2] animated:YES];
该代码会流行到navigationController的堆栈上的第三视图 - 控制。
我认为它能够更好地计算视图控制器的数量,你一叠,然后减去你想弹出视图控制器的数量。
NSInteger noOfViewControllers = [self.navigationController.viewControllers count];
[self.navigationController
popToViewController:[self.navigationController.viewControllers
objectAtIndex:(noOfViewControllers-2)] animated:YES];
有了这个解决方案你不会弄乱弹出,如果你添加一个新的视图到您的项目以后。
如果保存参考它为我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.
}
此外,至于是什么你做错了,我相信之所以[self.navigationController popViewControllerAnimated:YES]
不工作,第二次是因为你很可能使正被第一次调用弹出屏幕上的第二个呼叫。 第一个电话后,当前画面从导航控制器删除,因此你的时间做第二个电话, self.navigationController
将返回nil,因为它不再具有导航控制器。