2012-10-17 43 views
3

我想提出一個小的應用程序與UINavigationController的以下視圖層次之間的自定義導航:子類的UINavigationController的意見

登錄 - >選項 - >三種不同的觀點

的問題是,我想要在以下方式之間瀏覽最後3個視圖:

1<->2 
1<->3 
2<->3 

即ie能夠切換到任何視圖呃視圖,它提醒UITabViewController功能。所以,它不是分層的,它是任何圖形。要在視圖之間切換,我將使用導航欄中的按鈕。

對我來說,最簡單的方法是繼承UINavigationController,添加與我的視圖相對應的屬性,並實現在這些視圖之間切換的方法(使用pushViewController和popToRootViewController)。這些方法將從視圖中調用(導航)。

但是,參考文獻指出UINavigationController不適用於子類。 http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html

你推薦我做什麼?

+0

我不認爲這個子類UINavigationController是一個好主意。此外,我認爲這不在NDA之下。 你有什麼想要在視圖之間轉換的想法嗎? –

+0

我需要的轉換隻是一個簡單的內置動畫轉換。這個想法是把這些所有的VC放在一個堆棧中,然後根據當前VC中按下的按鈕顯示一個VC。 – Alexander

回答

0

我會繼續,但的UINavigationController而不是使用通常的pushViewController:,切換視圖這樣的:

NSMutableArray *viewControllers = [self.navigationController.viewControllers mutableCopy]; 
    // from here you can modify the order of controllers as much as you want 
[viewControllers addObject:nextViewController]; 
[viewControllers removeObject:self]; 

[self.navigationController setViewControllers:viewControllers animated:YES]; 

如果你不希望動畫是如何變成了,你可以設置animated:NO,要麼附上setViewControllers:[UIView animate...]區塊中,或將您自己的自定義CAAnimation添加到導航控制器的圖層中。

+0

感謝您使用setViewControllers作爲解決方法的想法。不過,以下內容對我來說並不清楚:我需要將這3個ViewControllers的個人堆棧放入UINavigationController堆棧中,以便導航。我應該在哪裏存儲以便每個VC都可以訪問堆棧? – Alexander

+0

無論你想要什麼,你都可以對'navigationController.viewControllers'重新排序。您不需要存儲任何內容,因爲您只是使用默認的導航控制器堆棧;您只是提供自定義訂購,而不是常見的推式流行訂單。你甚至不需要保留所有viewController的實例;隨着用戶的進行,重新創建每一個。通過這種方式,您可以創建無限導航堆棧的幻覺。 –

+0

我打算在每個視圖中創建一個像「performSwitchToViewControllerByTitle:(String)vcTitle」的方法。在該方法內部,我將從UINavigatorController獲得一個NSArray的VC,將VC與title == vcTitle放在數組的末尾,然後放回數組。我唯一不喜歡的是我需要在第一次轉換時(在需要時)創建我的VC實例,因此每個VC都必須包含其他VC的頭文件。 – Alexander

0

使用以下代碼的視圖控制器添加到導航控制器,

導航離開第一 - >第二

SecondViewController *secondView = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
    NSMutableArray *navigationarray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
    [navigationarray removeAllObjects]; 
    [navigationarray addObject:secondView]; 
    self.navigationController.viewControllers = navigationarray; 

導航離開第一 - >第三

ThirdViewController *thirdView = [[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:nil]; 
    NSMutableArray *navigationarray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
    [navigationarray removeAllObjects]; 
    [navigationarray addObject:thirdView]; 
    self.navigationController.viewControllers = navigationarray; 

上面代碼將從導航陣列中刪除所有viewControllers並放置一個新的視圖控制器

如果妳想要去一個特定的視圖控制器,然後用下面的代碼...

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1]動畫:是]

變化指向你的視圖控制器在堆棧中。

+0

謝謝。但是,我不想每次需要切換到新的VC時都會實例化一個新的VC。我需要從我的一堆風險投資中推動它。此外,我需要在某個時間點返回到RootViewController,這也是我需要保留的地方。 – Alexander

+0

我編輯了答案,我不知道它是否已經實施... –

+0

我已經根據其他建議,對VC實例管理更適合。 – Alexander