使用Swift 4关闭iOS中的所有模态

时间:2018-11-15 13:22:00

标签: ios swift modalviewcontroller

我正在尝试实现类似于iOS的Netflix App的导航。当您单击电影时,将弹出一个带有关闭按钮的模态窗口。如果在这部电影中我选择看另一部电影,则弹出第二个模态,除了“关闭”按钮外,还会显示“后退”按钮。我可以使用“后退”按钮一次关闭,然后使用“关闭”按钮返回到基本屏幕。

我可以使用

关闭一个视图
dismiss(animated: true, completion: nil)

但是如何返回基本屏幕一次关闭所有模态?另外,模态方法是否可行?我之所以选择它,是因为我不希望导航栏位于顶部。

我正在Xcode 10中使用Swift 4.2。

2 个答案:

答案 0 :(得分:0)

尝试

 self.navigationController?.viewControllers.removeAll(where: {$0.isModalInPopover})

答案 1 :(得分:0)

解雇ViewController的方法不是正确的方法。呈现视图控制器负责关闭视图控制器。理想情况下,您必须在展示的ViewController中实现一个协议,然后从“展示的” ViewController而不是“展示的” ViewController中删除模态。

您的方式仍然有效的原因是,当ViewController调用self.dimiss时,如果没有什么需要关闭的,UIKit会将其委托给其父级。如果您采用这种正确的方式,则关闭后,当前显示的视图控制器将被关闭,因此所有显示的视图控制器将被关闭,而不是最后一个。

From Apple Docs:

  

呈现视图控制器负责解散其呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,则UIKit会要求呈现的视图控制器处理撤消。

     

如果您连续显示多个视图控制器,从而构建了一个显示的视图控制器堆栈,则在堆栈中较低的视图控制器上调用此方法将取消其直接子视图控制器以及该堆栈上该子视图之上的所有视图控制器。发生这种情况时,只有最上面的视图会以动画方式关闭;只需从堆栈中删除所有中间视图控制器即可。最顶层的视图使用其模式转换样式关闭,该样式过渡样式可能与堆栈中较低的其他视图控制器使用的样式有所不同。

     

如果要保留对视图控制器的已显示视图控制器的引用,请在调用此方法之前在presentedViewController属性中获取值。

     

在提供的视图控制器上调用viewDidDisappear(_ :)方法后,将调用完成处理程序。