Iphone 调用popViewControllerAnimated两次

Iphone 调用popViewControllerAnimated两次,iphone,uinavigationcontroller,Iphone,Uinavigationcontroller,我有一个UINavigationController,上面有一系列UIViewControllers。在某些情况下,我只想弹出两个级别。我原以为可以连续调用两次popViewControllerAnimated,但第二次调用时,它没有弹出任何内容,而是返回NULL。我是否需要存储对目标VC的引用并调用popToViewControllerAnimated?我可以这样做,但这会使我的代码复杂化,因为当我将VCs推到堆栈上时,我必须传递UIViewController* 以下是相关片段: UIVie

我有一个
UINavigationController
,上面有一系列
UIViewControllers
。在某些情况下,我只想弹出两个级别。我原以为可以连续调用两次
popViewControllerAnimated
,但第二次调用时,它没有弹出任何内容,而是返回NULL。我是否需要存储对目标VC的引用并调用popToViewControllerAnimated?我可以这样做,但这会使我的代码复杂化,因为当我将VCs推到堆栈上时,我必须传递
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堆栈上的第三个viewcontroller。

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

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

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

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

如果您将引用保存到
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.
}

哦,我想我可以让它为我工作,而不必传递ViewController指针。谢谢仅供参考,我必须使用viewControllers.count-3返回两次。vc.count-1是顶视图,从那里返回的两个是-3.Perfect!你甚至知道我想跳到第三个viewcontroller——我所要做的就是剪切和粘贴。谢谢,谢谢你。不幸的是,我的应用程序在双重弹出视图之前有一个视图,该视图可能在堆栈中,也可能不在堆栈中。。。无论如何,很高兴知道这一点@Johno您还可以在堆栈上的视图控制器之间循环,以找到您要查找的视图控制器。视图控制器的索引为0(noOfViewControllers-1)。因此,当前视图控制器为(noOfViewControllers-1)。(NoofViewController-2)相当于popViewController。若要返回2个视图控制器,请使用(noOfViewControllers-3)。@Flatron对您的答案进行一个小的编辑,需要在2个级别使用此选项,因为计数不会像objectAtIndex那样考虑0的位置:NSInteger noOfViewControllers=[self.navigationController.viewControllers count]-1; [self.navigationController popToViewController:[self.navigationController.ViewController对象索引:(noOfViewControllers-2)]已设置动画:是];谢谢你的回答,我也像你一样为我工作,但不知道为什么。。。?你最后发现了吗?