iOS開發(fā)中的present與dismiss控制器UIViewController

我們都知道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)步!

附上Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容