1

如果我有一個UITabBarController(2個選項卡)作爲根視圖控制器,則在第一個選項卡(FirstTabViewController)中,我使用根視圖控制器AddReminderViewController初始化一個UINavigationController並顯示它。按代碼操作視圖層次

然後在AddReminderViewController裏面,我用另一個UINavigationController與一個叫做ChooseOptionViewController的根視圖控制器一起呈現它。

現在當我在裏面ChooseOptionViewController我想以編程方式返回FirstTabViewController我該如何做到儘可能簡單?我需要- dismissViewController...在我已經介紹過的所有視圖控制器上還是有更簡單的方法?

也在ChooseOptionViewController裏面我怎樣才能找出出現ChooseOptionViewController的班?我試圖做[self.presentingViewController class]但只是說UINavigationController(不AddReminderViewController

+0

你爲什麼要創建第二個導航控制器?您可以將第一個導航控制器上的所有視圖控制器都推送出去。 – Marcel

+0

@Marcel這是一段時間以前的設計決定... –

回答

0

現在,當我在裏面ChooseOptionViewController我想 程式設計回去FirstTabViewController我怎麼能做到這一點的 簡單越好?

你真的不應該讓ChooseOptionViewController試圖自己管理所有的東西。它應該簡單地告訴它的父母它的工作已經完成,並讓父母解僱它。父母然後可以告訴其父母其工作已完成,等等。這種方法將使維護你的代碼更容易,並且在你決定必要時改變它,而不會破壞ChooseOptionViewController。

例如,假設AddReminderViewController想要發生其他事情,例如在ChooseOptionsViewController已經出現之後呈現ChooseMoreOptionsViewController。如果AddReminderViewController負責其程序部分的流程,那很簡單。如果ChooseOptionsViewController知道足夠的應用程序重置以關閉視圖控制器一直返回到FirstTabViewController,那麼每當流程發生變化時都必須對其進行修改。這不是長期成功的祕訣,它增加了許多不必要和無用的複雜性。

+0

正常的流程是用戶與視圖交互,他可以取消(這將在ChooseOptionViewController上調用'-dismiss ...')等等。但是,當應用程序進入後臺時,我希望應用程序重置爲第一個選項卡。 –

+1

@PeterWarbo在這種情況下,您仍然希望父視圖控制器負責。一種方法是讓應用程序委託或FirstTabViewController發佈其他控制器(如AddReminderViewController)偵聽的通知。這個通知意味着「沒問題,按任何你所做的操作,然後關閉任何模態視圖控制器,之後,FirstTabViewController可以使用popToRootViewController。 – Caleb

0
generally unless an exception you should use only one navigation controller. 
keep pushing view controllers onto it. 
in that way you can move pop top to root view controller. 


for ex: 

1 
just add one navigation controller to tab 1 

2 
setrootviewcontroller of navigation controller to FirstTabViewController 

3 
from FirstTabViewController you can push AddReminderViewController(using the same navigation controller) 
ex:- [self.navigationController PushViewController:....]; 

4 
from AddReminderViewController you can push ChooseOptionViewController(using the same navigation controller) 
ex:- [self.navigationController PushViewController:....]; 



5 finally use [self.navigationController popToRootViewController]; 
+1

這是不正確的,可以通過模態呈現導航控制器,這樣你就可以有一個模態跨越多個視圖控制器的交互通常比將另一個模式視圖控制器置於另一個之上更合意... – Caleb

+0

ok先生...您需要參考最底層的導航控制器並調用popToRootViewController。 –

+0

'-popToRootViewController'不會關閉模態顯示的視圖控制器。 – Caleb