调用popViewControllerAnimated两次

Mik*_*ale 26 iphone uinavigationcontroller

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.
}
Run Code Online (Sandbox Code Playgroud)

我在做一些奇怪的事吗?我想写一些惯用的代码,所以如果"正确"的方式是打电话popToViewControllerAnimated,或者完全不同的话,我会乐意改变它.

Ben*_*ris 68

在这种情况下,您需要回弹到navigationController中的特定viewcontroller,如下所示:

[self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:2] animated:YES];
Run Code Online (Sandbox Code Playgroud)

该代码将弹出到navigationController堆栈上的第三个viewcontroller.

  • 作为一个FYI,我不得不使用viewControllers.count - 3来回到两个.vc.count - 1是顶视图,后面两个是-3. (5认同)

Fla*_*ron 19

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

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

使用此解决方案,如果稍后向项目添加新视图,则不会弄乱pop.

  • 视图控制器是索引0到(noOfViewControllers-1).因此,当前视图控制器是(noOfViewControllers-1).(noOfViewControllers-2)相当于popViewController.要返回2个视图控制器使用(noOfViewControllers-3). (3认同)