给出以下视图控制器布局。
我们首先在B
上展示A
,然后在C
上展示B
,从而构建一组模态视图控制器。根据{{3}},在A
上调用它实际上应该以动画方式关闭最顶层的视图控制器(在这种情况下为C
)并且所有中间视图控制器都没有动画。但是会发生C
在没有动画的情况下被解雇而B
以动画方式被驳回。
我提出了一个复制该行为的Apple documentation on dismiss(animated:completion:)
。我错过了什么或者我在这里误解了文档吗?
答案 0 :(得分:5)
在浏览网页并尝试各种“解决方案”之后,很明显这是iOS中的一个实际错误。它自iOS 8以来一直存在......并且仍然存在于iOS 10中。它最初是在iOS 8中报告的,但该解决方案从未经过验证,并且由于不活动,Apple会自动关闭雷达。
我提交了一份新雷达,因为这与dismissViewController
如果你连续出现几个视图控制器,那么建立一个 一堆呈现的视图控制器,调用此方法(意味着 - 在堆栈下方的视图控制器上的[UIViewController dismissViewControllerAnimated:completion])解除其直接子视图 控制器和堆栈上该子节点上方的所有视图控制器。 发生这种情况时,只有最顶层的视图在动画中被解除 时尚;任何中间视图控制器都可以从中删除 叠加。
明确问题的可视化,包括预期结果和实际结果。感谢Boris Survorov测试项目和可视化。
答案 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
将按预期工作。