天天看點

關于presentModalViewController的一點兒思考

關于presentModalViewController的一點兒思考

  有一個多月沒有寫blog了,手有點兒生。今天沒事兒,突然想起以前文檔中看到關于彈出模态對話框的一個知識點,于是想着何不動手驗證一下。

  我們都知道使用彈出模态視圖時有兩個重要的函數presentModalViewController和dismissModalViewControllerAnimated,前面一個函數相信大家使用起來都沒有問題,我想說的是後面這個函數dismissModalViewControllerAnimated,通過字面我們可以看出它的意思就是使彈出視圖消失。我們設A彈出B,那麼A就是presenting一方,B就是presented一方。那麼該由誰來調用這個方法呢,是彈出的一方,還是被彈出的那一方呢,為此找到官方文檔中如下解釋:

  通過解釋我們可以看出,presenting一方是負責讓彈出模态視圖消失的,但是系統在此處幫我們做了一個周遊就是當我們在被彈出一方調用該函數時候,系統會自動把這個消息傳遞到彈出它的那個VC中。

  下面我們在思考個問題,如果A彈出B,B又彈出C,此時我們通過B調用dismissModalViewControllerAnimated方法,到底是隻有C被dismiss還是B和C一起被dismiss呢?

  我寫了一個小程式驗證了一下,程式如下:

  上面程式中我們可以看出,一開始我們建立一個A,然後添加到window中,然後彈出B,B在彈出C,接着我們就調用[_svVCB dismissModalViewControllerAnimated:NO];

  運作結果如下:

關于presentModalViewController的一點兒思考
關于presentModalViewController的一點兒思考
關于presentModalViewController的一點兒思考

  上圖中最左邊的圖是沒有調用任何dismiss的情況下的結果,中間這幅圖是通過B調用一次dismissModalViewControllerAnimated的結果,右邊的圖是連着通過B調用兩次dismissModalViewControllerAnimated的結果。

  通過程式測試我們可以發現當一個VC即是被彈出方(被A彈出),也是彈出方(彈出C)的時候,調用dismiss的時候是直接将其彈出的VC消失掉,而不是傳遞該消息到彈出它的VC去,隻有當該VC沒有彈出别的VC的時候才會傳遞消息到彈出它的VC去。這塊兒可能說的有點兒繞,簡單的說就是無私原則,就是B已經占了資源了,當接到釋放指令的時候,就必須的先交出自己的,自己沒有占有資源的時候才能嘗試向上一級發出申請。

部門招人: 進階iOS、Android、前端開發,有意私聊,部落客請你喝️

如果覺得本文幫到了你,記得點贊哦,當然也可以請部落客喝一杯豆漿

微信二維碼

QQ二維碼

繼續閱讀