多个视图控制器推入导航控制器栈的问题

16

我正在尝试将三个视图控制器推入导航控制器中。

  [self.navigationController pushViewController:one animated:YES];
  [self.navigationController pushViewController:two animated:YES];
  [self.navigationController pushViewController:three animated:YES];
期望的行为是显示视图三,当按下后退按钮时,它将转到视图二,然后转到视图一...
实际发生的情况是可见的是视图一,按下后退按钮会转到视图二,再按一次后退按钮会回到视图一。也就是说,显示的是视图一而不是视图三。
非常奇怪的是,在上述调用之后查看 navigationController 的 viewController 数组可以看到正确的条目,查看 visibleViewController 属性则显示其中有视图三... 即使显示的是视图一。
如果我从显示在视图三位置的可见视图一导航到子视图,然后从该子视图按下后退... 它会转到视图三。
看起来它正在显示视图一,但知道它在视图三上...
我完全困惑了... 有什么想法吗?
Jim
2个回答

35

前两次推送时,不要将animated标志设置为YES,而应该设置为NO:

[self.navigationController pushViewController:one animated: NO]; 
[self.navigationController pushViewController:two animated: NO];
[self.navigationController pushViewController:three animated: YES];
这样可以实现你想要的效果。否则,动画系统会因为尝试将三个视图动画到同一空间而变得混乱。

1
非常出色。谢谢Ben! - Jim
非常好的答案,如果这是我的问题,我会接受这个答案。在XCode 5和iOS 7上为我解决了问题。 - Cory Trese
谢谢你的回答,可惜楼主从未接受它,因为它是正确的答案。不知道版主能否处理这个问题? - Ser Pounce
嗨,本。如果我需要通过推送传递数据,我该如何从AppDelegate中传递它? - Gajendra Rawat
这将首先立即显示屏幕2,然后平稳地过渡到屏幕3。但通常情况下,您希望从当前视图平稳地过渡到屏幕3,而不显示其他任何内容。为此,您必须使用setViewControllers方法,如@KimAMartinsen所解释的那样。 - Radu Simionescu

16

目前得票最高的回答存在问题,就是在第三个选项显示之前,第一和第二个选项会在一瞬间显现出来。虽然不是很大的问题,但会对用户留下不好的印象。你需要的解决方案是:

NSMutableArray *controllers = [self.navigationController.viewControllers mutableCopy];
[controllers addObject:one];
[controllers addObject:two];
[controllers addObject:three];
[self.navigationController setViewControllers:controllers animated:YES];

这将以三种方式进行动画,而在此过程中,不会出现一或二变得可见。


该答案提供了所需的效果,因为将动画标志设置为“否”的整个目的是我不想看到第一个和第二个视图控制器。 - mrl
这实际上是正确的答案。 - Radu Simionescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接