2014-02-14 131 views
0

我解決可能是最有圖的幫助說明了問題:我工作的一個應用程序最佳實踐層次結構

|---|  |---| 
| |  | | 
| B | --> | C | 
| |  | | 
|---|  |---| 
^  | 
    |   v    
|---|  |---| 
| |  | | 
| A | --> | D | 
| |  | | 
|---|  |---| 

其中一個導航控制器, A呈現給用戶。它包含一個集合視圖。用戶可以點擊集合中的條目,並將D推入導航堆棧,或者點擊按鈕在集合中創建新條目。這導致模態地呈現另一個導航控制器B。作爲創建條目的一部分,用戶導航至推入B的導航堆棧的C。一旦用戶配置了條目,我想要關閉模態呈現的控制器並直接轉至D以向用戶顯示新創建的條目。用戶不應該看到AD的轉換。

如果我的解釋相當缺乏,上述內容與標準日曆應用程序中的流程非常相似:如果您在月視圖中並創建新事件,它會以模態方式顯示控制器,直接進入日視圖。

C可以撥打dismissViewControllerAnimated:completion:返回A。冒着問一個主觀問題的風險,在C自行解散之前是否有導致D被推到A的導航棧上的最佳做法?我可以通過B將一個代表傳遞給C,但是傳遞這樣的東西感覺有點笨拙。我也考慮過使用通知,但這也不正確。也許故事板在這裏會有所幫助,但是如果存在這樣的事情,我更喜歡一種乾淨的基於代碼的方法。

回答

1

我不認爲你想要做什麼有什麼問題。

所以,你必須具有一個導航控制器作爲根:

NAV1 --> A 

僅有B存在模態在所述導航控制器(B實際上是另一個導航控制器的根)

NAV1 --> A 
| 
v 
NAV2 --> B 

然後向前推Ç到第二個導航控制器上

[B.navigationController pushViewController:C ...] 

NAV1 --> A 
| 
v 
NAV2 --> B --> C 

然後當你想解僱C(和B)並回到D,首先將D推到第一個導航控制器上。您可以輕鬆地獲得通過presentingViewController屬性參照第一導航控制器:

[((UINavigationController*) C.navigationController.presentingViewController) pushViewController: D ...] 

NAV1 --> A --> D 
| 
v 
NAV2 --> B --> C 

則取消第二導航控制器:

[C.navigationController dismissViewControllerAnimated: ...] 

NAV1 --> A --> D