關於iOS的presentingViewController&presentedViewController你真的懂了麼

語言: CN / TW / HK

前言

我正在參與掘金技術社區創作者簽約計劃招募活動,點擊鏈接報名投稿

前段時間工作中,做一個獲取頂層控制器組件的時候,遇到了在遍歷導航棧的控制器後,再查找當前導航棧的頂層控制器,是否有模態出來的vc的問題。基於這個問題,我想大部分人第一時間想到的都是vc的presentingViewController,以及presentedViewController這兩個屬性。所以我也第一時間百度了一下,某篇文章赫然寫着 假設 AVC 模態出來了(present)BVC。 那麼AVC.presentedViewController == BVC, BVC.presentingViewController == AVC。然而事實真的是這樣嗎?下面我們來驗證幾種場景。

場景一

新建一個Demo iOS項目,不加入任何父控制器,直接新建BViewController,在默認的ViewController裏面加入一個button,present到BViewController。

```

@IBAction func click(_ sender: Any) {

let vc = BViewController()

vc.modalPresentationStyle = .fullScreen

self.present(vc, animated: true)

}

```

結果:

這種情況下,確實是如百度所説。VC.presentedViewController == BVC, BVC.presentingViewController == AVC

場景二

新建一個Demo iOS項目,主入口帶有導航欄,且主VC下包含ChildNaviVC,ChildNaviVC的rootVC 為viewController.

結構圖如下:

```

@IBAction func click(_ sender: Any) {

let vc = BViewController()

vc.modalPresentationStyle = .fullScreen

self.present(vc, animated: true)

}

```

結果:

這種情況下,BVC的 presentingViewController盡然變成了一個UINavigationCOntroller(這個導航控制器其實為入口函數最頂層的那個導航控制器)。為什麼會出現這種情況?那我們只能探究蘋果的API文檔

探究蘋果官方文檔

答案是顯而易見的,從文檔註釋得知,presentingViewController這個屬性,呈現的是誰模態該控制器的控制器,但是如果present這個控制器的控制器,有parsent視圖,那麼該屬性則為它最遠的祖先控制器。

Demo地址

Test Present Demo

結尾

從這個小小的事件得出,我們遇到問題故而可以查閲百度,但是我們切勿不能遺忘官方的文檔,甚至第一時間應該先看官方文檔。對百度出來的結論切勿不可盡信。如果我這篇文章,對你有幫助,那麼就給我一個贊吧。👍

我正在參與掘金技術社區創作者簽約計劃招募活動,點擊鏈接報名投稿