给定以下视图控制器布局。
我们通过首先在A
上呈现B
,然后在B
上呈现C
来构建模态视图控制器堆栈。根据苹果关于dismiss(animated:completion:)
的文档,在A
上调用它实际上应该以动画方式解除顶部视图控制器(在这种情况下为C
)和所有中间视图控制器,但发生的是C
被无动画地解除,而B
则以动画方式解除。我上传了一个Xcode项目到GitHub,复制了这个行为。我是不是漏掉了什么或者我误解了这里的文档?
给定以下视图控制器布局。
我们通过首先在A
上呈现B
,然后在B
上呈现C
来构建模态视图控制器堆栈。根据苹果关于dismiss(animated:completion:)
的文档,在A
上调用它实际上应该以动画方式解除顶部视图控制器(在这种情况下为C
)和所有中间视图控制器,但发生的是C
被无动画地解除,而B
则以动画方式解除。在浏览网络并尝试各种“解决方案”后,显然这是iOS中的一个实际错误。自iOS 8以来一直存在......并且在iOS 10中仍然存在。它最初是在iOS 8中报告的,但解决方案从未得到验证,由于不活动而被苹果自动关闭了radar。
我已经提交了一个新的radar,因为这与dismissViewController
的文档直接矛盾。
如果您连续呈现多个视图控制器,从而构建了一个呈现的视图控制器堆栈,则在堆栈较低的视图控制器上调用此方法(即- [UIViewController dismissViewControllerAnimated:completion])将取消显示其直接子视图控制器和该子视图控制器以上的所有视图控制器。当发生这种情况时,只有最顶部的视图以动画方式消失;任何中间视图控制器都将从堆栈中简单地删除。
清晰地展示了问题,包括预期和实际结果。感谢Boris Survorov提供测试项目和可视化效果。
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
我猜你从A到B的segue也是模态的?在这种情况下,从A调用的dismiss
函数想要关闭视图,该视图立即位于A之上,即B。C只是被隐藏了,以显示B的动画隐藏。在这个意义上,如果你走得那么远,你不能通过模态segue堆叠视图并使用dismiss
函数来关闭顶部视图,就像你描述的那样。但是,如果从B调用dismiss
来关闭C,则会按预期工作。