解散模态视图控制器堆栈

时间:2016-08-05 10:26:49

标签: ios cocoa-touch uikit

给出以下视图控制器布局。

View Controller Layout

我们首先在B上展示A,然后在C上展示B,从而构建一组模态视图控制器。根据{{​​3}},在A上调用它实际上应该以动画方式关闭最顶层的视图控制器(在这种情况下为C)并且所有中间视图控制器都没有动画。但是会发生C在没有动画的情况下被解雇而B以动画方式被驳回。

我提出了一个复制该行为的Apple documentation on dismiss(animated:completion:)。我错过了什么或者我在这里误解了文档吗?

3 个答案:

答案 0 :(得分:5)

在浏览网页并尝试各种“解决方案”之后,很明显这是iOS中的一个实际错误。它自iOS 8以来一直存在......并且仍然存在于iOS 10中。它最初是在iOS 8中报告的,但该解决方案从未经过验证,并且由于不活动,Apple会自动关闭雷达。

我提交了一份新雷达,因为这与dismissViewController

的文档完全相反
  

如果你连续出现几个视图控制器,那么建立一个   一堆呈现的视图控制器,调用此方法(意味着    - 在堆栈下方的视图控制器上的[UIViewController dismissViewControllerAnimated:completion])解除其直接子视图   控制器和堆栈上该子节点上方的所有视图控制器。   发生这种情况时,只有最顶层的视图在动画中被解除   时尚;任何中间视图控制器都可以从中删除   叠加。

明确问题的可视化,包括预期结果和实际结果。感谢Boris Survorov测试项目和可视化。

Expected Results Actual Results iOS 8+

答案 1 :(得分:3)

我经历过同样的问题,而且我发现这是一个可行的解决方法。当您需要关闭整个堆栈时,请在A:

中执行此代码
viewControllerB.view.isHidden = true
viewControllerC.dismiss(animated: true) // or viewControllerB.dismiss(animated:true) - it should produce the same result: dismiss viewControllerC
dismiss(animated: false) // dismisses viewControllerB

这应该导致预期的行为。

答案 2 :(得分:0)

我猜你从A到B的segue也是模态的?在这种情况下,从A调用的dismiss函数想要关闭视图,该视图立即位于A的顶部,即B.为了向您显示B的动画隐藏,就会隐藏它。在这个意义上你无法通过模态segues堆叠视图,如前所述,使用dismiss函数关闭顶部视图。如果从B调用以解除C,dismiss将按预期工作。