如何在模态视图控制器之间过渡并删除隐藏的控制器?

时间:2018-08-24 10:07:21

标签: ios swift uiviewcontroller modalviewcontroller

主视图控制器(M)提供了一种模式视图控制器(A)。应该介绍另一个模态视图控制器(B)。过渡应该是从(A)到(B),而没有(M)出现。过渡到(B)后,隐藏的(A)应该被取消初始化。如何实现?

我正在寻找基于代码的解决方案,此处未使用Interface Builder / Storyboard。

在标记为重复项之前:SO上存在类似的问题,询问如何从另一个MVC呈现MVC,这不是我的问题。

2 个答案:

答案 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(_ :)方法   控制器。

*