2009-07-14 62 views
24

我有一个UINavigationController和一系列的UIViewControllers就可以了。在某些情况下,我想要完全弹出两个级别。我认为我可以通过连续两次调用popViewControllerAnimated来实现,但事实证明,第二次调用它时,它不会弹出任何内容,而是返回NULL。我是否需要存储对目标VC的引用并调用popToViewControllerAnimated?我可以做到这一点,但它使我的代码复杂化了,因为我正在将VC推入堆栈,所以我必须通过UIViewController *。调用popViewControllerAnimated两次

下面是相关的代码片段:

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或其他的东西,我会很乐意改变它。

回答

63

在这种情况下,你需要跳出回特定的ViewController在navigationController像这样:

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

该代码会流行到navigationController的堆栈上的第三视图 - 控制。

+1

哦,我想我可以使这项工作对我来说,而不必通过周围的视图控制器指针。谢谢! – 2009-07-14 01:20:31

+4

作为一个供参考,我不得不使用viewControllers.count - 3两回。 vc.count - 1是顶视图,两个从那里返回-3。 – 2009-07-14 04:31:02

+1

完美!你甚至知道我想弹出到第三个视图控制器 - 我所要做的只是剪切和粘贴。谢谢。 – 2009-12-13 06:22:24

19

我认为更好的方法是统计堆栈中视图控制器的数量,然后减去要弹出的视图控制器的数量。

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

使用此解决方案,如果稍后向项目添加新视图,则不会搞砸弹出窗口。

1

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

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. 
}