主视图控制器(M)提供了一种模式视图控制器(A)。应该介绍另一个模态视图控制器(B)。过渡应该是从(A)到(B),而没有(M)出现。过渡到(B)后,隐藏的(A)应该被取消初始化。如何实现?
我正在寻找基于代码的解决方案,此处未使用Interface Builder / Storyboard。
在标记为重复项之前:SO上存在类似的问题,询问如何从另一个MVC呈现MVC,这不是我的问题。
答案 0 :(得分:1)
另一个答案,因为评论太长了。
哦,现在的问题完全不同了。您无法以自己的方式达到自己的期望。从那以后,文档指出:
“例如,必须通过视图进行全屏演示 控制器本身覆盖了整个屏幕。如果当前视图 控制器无法满足请求,它将请求转发 视图控制器层次结构到其最近的父级,然后可以 处理或转发请求”。
因此,如果您从A提出B,则无法通过保存(B)来初始化(A)。应取消A,以允许M存在(A)。
但是,您不能通过呈现模态视图控制器,而是在M中拥有childViewControllers [(A),(B)]并在(M)中设置其外观的动画来实现它,然后在出现时将其删除即可需要。
答案 1 :(得分:0)
首先,您应该了解,如果删除显示了您的(B)的隐藏模态视图控制器(A),则(B)也将关闭。
由于您要求从(B)中删除(A),因此您需要传递视图控制器的父级,因此您希望将其关闭,在这种情况下(M)是(A)的父级,因此(B) ,应该知道(M)。然后,你做
(M).dismiss(animated: true, completion: nil)
这意味着视图控制器M将解散它的子视图控制器,对于您的情况为(A)。
这里的重点是在父视图控制器上调用dismiss。可以在Apple提供的解雇描述中找到解释(我强调了一些部分,请注意):-
*
关闭由视图模态显示的视图控制器 控制器。 呈现视图控制器负责 取消显示的视图控制器。如果您调用此方法 在呈现的视图控制器本身上,UIKit 询问呈现 查看控制器以处理解雇。如果您提出几种观点 控制器相继建立,从而构建了一个呈现视图的堆栈 控制器,请在 堆栈取消其直接子视图控制器和所有视图 堆栈中那个孩子上方的控制器。发生这种情况时,只有 顶部视图以动画方式消除;任何中间 视图控制器只是从堆栈中删除。最顶视图 使用其模式过渡样式来消除,这可能与 其他视图控制器使用的样式位于堆栈中较低的位置。如果你 想要保留对视图控制器呈现视图的引用 控制器,获取presentedViewController属性中的值 在调用此方法之前。完成处理程序在 在显示的视图上调用viewDidDisappear(_ :)方法 控制器。
*