2010-08-11 39 views
2

試圖圍繞如何圍繞UINavigationController構建應用程序來包裝我的頭。在我看來,大多數解釋都假設應用總是從根控制器開始,然後從那裏開始鑽取,但我不清楚這是如何適應登錄/註冊步驟的情況。該結構是這樣的:iPhone UINavigationController應用程序設計

Home page           | Main app (typical nav hierarchy) 
------------           |--------------------------------- 
Log in ----> Login page       | App section 1 
       ------------       | App section 2 
       Do login ------------------------> | etc. 
      <- Cancel        | 
                 | 
Register -------------------> Register page   | 
           -----------------  | 
           Do registration ---> | 
          <- Cancel    | 

所以基本上我假設「主應用程序」控制器實際上應該是應用程序的根控制器,是否正確?在這種情況下,我不清楚如何處理坐在它前面的整個過程(基本上就像是一個與應用程序導航結構分離的導航結構)。 「主頁」是在主應用程序上顯示的模式控制器,還是用於登錄/註冊步驟的單獨導航控制器,以便在登錄後將其彈出來讓我們回到應用程序根目錄?

希望我只是過分簡單的事情,只是還沒有點擊我。任何指針不勝感激。

編輯:所以這裏是我結束了,這似乎爲我所需要的。我有兩個UINavigationControllers,它們都分配給IB中的MainWindow,並帶有獨立的起始NIB。一個是應用程序啓動導航控制器(主頁/登錄/註冊),另一個是主要的應用程序導航控制器。我的應用程序委託有這樣的代碼:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [window addSubview:startNavController.view]; 
    [window makeKeyAndVisible]; 
    return YES; 
} 

- (void)activateMainApp { 
    [startNavController.view removeFromSuperview]; 
    [window addSubview:appNavController.view]; 
    [window makeKeyAndVisible]; 
} 

登陸/註冊的最後一步,我有這樣的代碼是什麼叫應用程序的委託,使導航控制器之間的切換:

- (IBAction)continuePressed { 
    // Transfer control to the main app nav controller: 
    MyAppDelegate *app = (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; 
    [app activateMainApp]; 
    [app release]; 
} 

我懷疑我可以用一個導航控制器完成這個任務,但是這對我來說基於我的視圖結構是合乎邏輯的,並且似乎可行,並且我最終將主視圖作爲應用導航控制器的根視圖。任何額外的反饋意見,如果有什麼骨頭的話,讚賞。

+0

你不應該在你的視圖控制器中調用'[app release]',因爲你沒有保留它。 – jowie 2012-10-19 14:05:06

+0

@bmosekau:爲什麼使用:'[window addSubview:startNavController.view];'而不是'self.window.rootViewController = startNavController'等等。 – 2013-08-06 06:38:16

+0

@ user2568508鄧諾。我不得不跳進我的時間機器,並撥回3年來回答這個問題。 – 2013-08-08 05:57:41

回答

3

您可以在任何階段創建一個UINavigationController,包括在您的登錄屏幕之後 - 將其作爲您想要開始使用它的視圖的子視圖。您將在該點看到視圖控制器(您製作新導航控制器的根視圖)。一旦擁有它,你可以將新的視圖控制器推到導航堆棧上。您可以看看導航堆棧

根控制器除了可以在一個調用(popToRootViewControllerAnimated)中獲得,並且您不能進一步彈出。所有由導航控制器管理的視圖控制器都位於堆棧上,因此您可以按壓堆棧或彈出堆棧。

我認爲這是一個有用的東西,當後退箭頭有用時。

+0

那麼你是說登錄/註冊步驟實際上不是由導航控制器管理的嗎?應用程序委託或標準視圖控制器將手動管理該部分? – 2010-08-11 06:48:40

+0

當然你可以做任何方法。一種方法可能是在屏幕的可見部分創建登錄視圖,然後在另一個視圖中從屏幕外位置創建動畫,以便在登錄驗證後覆蓋登錄屏幕。在您的導航控制器中加入動畫的視圖。如果有人點擊註銷按鈕,您可以再次將其滑出,請清除導航堆棧並重新開始。 (這好像是我同意的動畫控制器 - 但它在登錄屏幕上方設置了根視圖,並且您可能會使用一些動畫過渡來區分它與普通的應用內導航。) – 2010-08-11 06:56:27

+0

也許這有助於 - 您看到視圖。視圖位於視圖控制器中,導航控制器移動視圖控制器。視圖控制器可以做很多沒有,它們是一個方便的對象,將一個滑過另一個,然後再回來。 您的視圖可以位於可見區域或屏幕外 - 直到需要時纔將更大類型的控件(如UIDatePicker)放置在屏幕外區域,這一點相當常見,就像系統使用鍵盤一樣。當你需要它時,將它帶回到屏幕的可見部分。您也可以使用導航控制器視圖來啓動基於堆棧的導航。 – 2010-08-11 07:05:49

0

UINavigationController實際上只是一種組織UIViewControllers的方法。不必具有特定的根視圖。你只要把你想要的觀點放在最前面。

要在頂部添加另一個視圖控制器只需調用[UINavigationController pushViewController:animated:YES];