繁体   English   中英

使用Swift 4解除iOS中的所有模态

[英]Dismiss all modals in iOS with Swift 4

我正在尝试实现类似于iOS的Netflix应用程序的导航。 单击电影时,会弹出一个模式窗口,其中包含关闭按钮。 如果在这部电影中我选择看另一部电影,则弹出第二个模态,除关闭按钮外,还会出现一个后退按钮。 我可以使用后退按钮逐一关闭,关闭按钮返回基本画面。

我可以使用解雇单个视图

dismiss(animated: true, completion: nil)

但是我怎样才能回到基本画面一次关闭所有模态? 另外,模态是要走的路吗? 我之所以选择这个,是因为我不希望导航栏位于顶部。

我在Xcode 10中使用Swift 4.2。

你解雇ViewController的方式不正确。 呈现视图控制器负责解除视图控制器。 理想情况下,你必须在你的呈现ViewController中实现一个协议,并从你的'呈现'ViewController中解除你的模态而不是'呈现'的ViewController。

你的方式仍然有效的原因是,当一个ViewController调用self.dimiss如果没有什么可以解雇的话,UIKit会将它委托给它的父节点。 如果你实现这种正确的方式,一旦你解雇,你的呈现视图控制器将被解雇,因此所有呈现的视图控制器将被解雇而不是最后一个。

来自Apple Docs:

呈现视图控制器负责解除它所呈现的视图控制器。 如果在呈现的视图控制器本身上调用此方法,UIKit会要求呈现视图控制器处理解雇。

如果连续呈现多个视图控制器,从而构建一堆呈现的视图控制器,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器以及堆栈上该子视图上方的所有视图控制器。 发生这种情况时,只有最顶层的视图以动画方式被删除; 任何中间视图控制器都可以从堆栈中删除。 最顶层的视图使用其模态过渡样式被忽略,这可能与堆栈中较低的其他视图控制器使用的样式不同。

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

在呈现的视图控制器上调用viewDidDisappear(_ :)方法之后调用完成处理程序。

试试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM