iOS开发中的present与dismiss控制器UIViewC
我们都知道iOS开发中有两种常用的进入与销毁控制器方法,一种是存在导航栏的情况,另外一种就是今天我探究的模态进入与推出控制器。
一. 两个属性presentingViewController与presentedViewController
presentingViewController 代表推出当前控制器的控制器;
presentedViewController 代表当前控制器推出的控制器;
我们可以举例说明:A -> B -> C,假设B为当前控制器,那么A即为B的presentingViewController,C即为B的presentedViewController。
二. 控制器销毁的方法及顺序
还是刚才的例子,A -> B -> C,当我们在B控制器中调用方法
self.dismiss(animated: true, completion: nil)
会出现什么样的效果呢?答案是C控制器将会被销毁。所以在上面的例子中,想要实现只销毁C控制器,有三种方式可以选择:
B控制器中调用
self.dismiss(animated: true, completion: nil)
同样是在B控制器中调用
self.presentedViewController?.dismiss(animated: true, completion: nil)
在C控制器中调用
self.dismiss(animated: true, completion: nil)
那么,除了以上提到的这些方式,还有其他方式可以选择么?答案当然是有的,我们可以使用一直间接的方式,通过去销毁B控制器来连带销毁C控制器。还是我们刚才的例子:A -> B -> C,假设我们当前在C控制器,触发某一事件时,我希望实现效果,B和C控制器一起销毁,只保留显示A控制器,要想实现这个效果,可以使用最简洁明了的两种方式:回调和通知。相信有一定开发经验的同学可以轻松写出这种不同实现方式的代码,这里就只简单讲一下通知的方式:
C控制器中发出通知
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "dismiss"), object: nil, userInfo: nil)
若在A控制器中接收通知
NotificationCenter.default.addObserver(self, selector: #selector(dismissVC), name: NSNotification.Name(rawValue: "dismiss"), object: nil)
@objc private func dismissVC() {
self.dismiss(animated: true, completion: nil)
}
若在B控制器中接收通知
NotificationCenter.default.addObserver(self, selector: #selector(dismissVC), name: NSNotification.Name(rawValue: "dismiss"), object: nil)
@objc private func dismissVC() {
self.presentingViewController?.dismiss(animated: true, completion: nil)
}
上述两种方式都可以实现相同的效果
三. 调用dismiss需要注意的点
根据我们刚才的例子,细心的同学可以发现,当我们在C控制器调用
self.dismiss(animated: true, completion: nil)
只会销毁当前控制器C;若是在B控制器中调用该方法,那么B控制器不会被销毁,只会销毁C控制器,这是我们日常开发需求注意的细节事项。
希望本文可以帮助到广大iOS开发者,如有不足之处,欢迎各位及时指导,相互进步!