>主视图控制器(M(呈现的是模态视图控制器(A(。应提供另一个模态视图控制器(B(。转换应从 (A( 到 (B(,而不显示 (M(。转换到 (B( 后,应取消初始化隐藏的 (A(。如何实现这一点?
我正在寻找基于代码的解决方案,此处不使用界面生成器/故事板。
在标记为重复之前:SO 上有类似的问题,询问如何呈现来自另一个 MVC 的 MVC,这不是我的问题。
另一个答案,因为它太长了,无法评论。
哦,现在的问题完全不同了。你无法以你的意思实现你的愿望。因为,文档指出:
"例如,必须通过视图进行全屏演示 控制器本身覆盖整个屏幕。如果当前视图 控制器无法满足请求,它将请求向上转发 视图控制器层次结构到其最近的父级,然后可以 处理或转发请求"。
因此,如果您从 A 中呈现 B,则无法使用保存 (B( 来取消初始化 (A(。应忽略 A,以允许 M 存在 (A(。
但是,您不能通过呈现模态视图控制器来实现它,而是在 M 中放置子视图控制器 [(A(、(B(],并在 (M( 中对它们的外观进行动画处理,然后在需要时删除 (A(。
首先,你们应该明白,如果你删除了隐藏的模式视图控制器(A(,它显示了你的(B(,那么(B(也会关闭。
既然你要求从(B(中删除(A(,那么你需要传递视图控制器的父级,你希望关闭,在你的情况下是(M(是(A(的父级,所以你的(B(应该知道(M(。然后,你做
(M).dismiss(animated: true, completion: nil)
这意味着视图控制器 M 将关闭它的子视图控制器,这是 (A( 适用于您的情况。
此处的要点是在父视图控制器上调用 dismiss。解释可以在Apple提供的解雇描述中找到(我突出显示了部分,您应该注意(:-
*
关闭视图以模式方式呈现的视图控制器 控制器。呈现视图控制器负责 关闭它提供的视图控制器。如果调用此方法 在呈现的视图控制器本身上,UIKit询问呈现 查看控制器以处理解雇。如果您呈现多个视图 控制器连续,从而构建呈现视图的堆栈 控制器,在 堆栈关闭其直接子视图控制器和所有视图 堆栈上该子项之上的控制器。发生这种情况时,只有 最顶层的视图以动画方式关闭;任何中间体 视图控制器只是从堆栈中删除。最顶层视图 使用其模态过渡样式进行消除,该样式可能不同于 其他视图控制器使用的样式在堆栈中较低。如果你 想要保留对视图控制器的呈现视图的引用 控制器,获取呈现的视图控制器属性中的值 在调用此方法之前。完成处理程序在 viewDidDisappear(_:( 方法在呈现的视图上调用 控制器。
*