我們都知道iOS開發(fā)中有兩種常用的進(jìn)入與銷毀控制器方法,一種是存在導(dǎo)航欄的情況,另外一種就是今天我探究的模態(tài)進(jìn)入與推出控制器。
一. 兩個(gè)屬性presentingViewController與presentedViewController
presentingViewController 代表推出當(dāng)前控制器的控制器;
presentedViewController 代表當(dāng)前控制器推出的控制器;
我們可以舉例說明:A -> B -> C,假設(shè)B為當(dāng)前控制器,那么A即為B的presentingViewController,C即為B的presentedViewController。
二. 控制器銷毀的方法及順序
還是剛才的例子,A -> B -> C,當(dāng)我們?cè)贐控制器中調(diào)用方法
self.dismiss(animated: true, completion: nil)
會(huì)出現(xiàn)什么樣的效果呢?答案是C控制器將會(huì)被銷毀。所以在上面的例子中,想要實(shí)現(xiàn)只銷毀C控制器,有三種方式可以選擇:
B控制器中調(diào)用
self.dismiss(animated: true, completion: nil)
同樣是在B控制器中調(diào)用
self.presentedViewController?.dismiss(animated: true, completion: nil)
在C控制器中調(diào)用
self.dismiss(animated: true, completion: nil)
那么,除了以上提到的這些方式,還有其他方式可以選擇么?答案當(dāng)然是有的,我們可以使用一直間接的方式,通過去銷毀B控制器來連帶銷毀C控制器。還是我們剛才的例子:A -> B -> C,假設(shè)我們當(dāng)前在C控制器,觸發(fā)某一事件時(shí),我希望實(shí)現(xiàn)效果,B和C控制器一起銷毀,只保留顯示A控制器,要想實(shí)現(xiàn)這個(gè)效果,可以使用最簡(jiǎn)潔明了的兩種方式:回調(diào)和通知。相信有一定開發(fā)經(jīng)驗(yàn)的同學(xué)可以輕松寫出這種不同實(shí)現(xiàn)方式的代碼,這里就只簡(jiǎn)單講一下通知的方式:
C控制器中發(fā)出通知
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)
}
上述兩種方式都可以實(shí)現(xiàn)相同的效果
三. 調(diào)用dismiss需要注意的點(diǎn)
根據(jù)我們剛才的例子,細(xì)心的同學(xué)可以發(fā)現(xiàn),當(dāng)我們?cè)贑控制器調(diào)用
self.dismiss(animated: true, completion: nil)
只會(huì)銷毀當(dāng)前控制器C;若是在B控制器中調(diào)用該方法,那么B控制器不會(huì)被銷毀,只會(huì)銷毀C控制器,這是我們?nèi)粘i_發(fā)需求注意的細(xì)節(jié)事項(xiàng)。
希望本文可以幫助到廣大iOS開發(fā)者,如有不足之處,歡迎各位及時(shí)指導(dǎo),相互進(jìn)步!