2013-10-29 21 views
17

我明白dismissViewControllerAnimated:completion:popViewControllerAnimated:之間的差,如所描述on Stack Overflow和這裏:後果爲編程:dismissViewController VS popViewController

-dismissViewControllerAnimated:completion:方法用於解僱 一個的UIViewController,這是由該方法提出: -presentViewController:animated:completion:。的UINavigationController的

-popViewControllerAnimated:方法用於 彈出由 的UINavigationController的-pushViewController:animated方法示出的控制器。

我最近在我的應用程序中發現了一個錯誤,在那裏我使用[self dismissViewControllerAnimated:completion:]來解僱在導航嵌入式應用中推送的VC。我應該吃比薩餅時炸法。我沒有發現這個錯誤,因爲一切正常,我的VC被按預期解除分配。

我的問題:混合這兩種方法的後果是什麼?

回答

10

-presentViewController:animated:completion:-pushViewController:animated:意味着不同的事情。前者說「提出這個其他視圖控制器以取代你自己」。後者說「在你自己內部顯示這個其他視圖控制器,作爲你正在控制的列表的一部分」。

所以這是關於在轉換後誰被認爲負責顯示。在前一種情況下,導航控制器放棄控制權。在後者中它保持控制。

前者的功能由UIViewController提供。後者特定於UINavigationController

因爲這兩種行爲是完全不同的,所以相反的行爲是分開的。導航控制器可以捕獲dismissViewController:...並檢查指定的控制器是如何呈現的,分支到超類或pop...中,但是從設計和維護的角度來看,任務的合併是沒有吸引力的。

由於導航控制器不承諾將一件事情映射到另一件事上,並且如果您傳遞的控制器以前沒有出現過,並且UIViewController不承諾任何特定行爲,我認爲您的問題的字面上的答案是:混合這兩個東西的後果是未定義的行爲。

1

林不知道如果我能解釋這最好的我想,但讓我試試。

我正在使用基於標籤的應用程序,每個標籤都有自己的導航控制器。對於側面特徵,我在導航欄分支上有一個barbuttonitem,以模態視圖(並且在某些情況下爲全新的導航控制器的模式,以控制特定功能的路徑的backstack。

我將調用dismissViewController任何導航控制器,我發動過的對方爲模式的根視圖(我希望是有道理的。)

這也許是更好的。

的呈現視圖控制器負責駁回視圖控制器如果你在提交的視圖控制器本身調用這個方法,它會自動轉發消息e到呈現視圖控制器。

如果出現連續幾個視圖控制器,從而構建呈現視圖控制器的堆棧,調用視圖控制器這種方法在堆棧中較低駁回其直接子視圖控制器和孩子最重要的視圖控制器在堆棧上。當發生這種情況時,只有最頂級的觀點纔會以動畫形式被解僱;任何中間視圖控制器都可以簡單地從堆棧中移除。最頂層的視圖使用其模式轉換樣式被解散,這可能與堆棧中較低視圖控制器使用的樣式不同。

推送基於導航的視圖控制器,並在需要時使用popViewController。模態地引入任何從導航分支出來的東西,並在這種情況下根據需要使用dismissViewController。