7

嘿大家,我是新的iPhone開發,我不理解整個UINavigationController和UITabBarController的想法。是另一種替代品 - Tweetie這樣的應用程序如何將兩者結合起來?在應用程序中有UITabBar和UINavigationController?

我想讓我的應用程序在底部有一個持久性標籤欄(這似乎是工作),而且還有一個頂部的導航欄,它可以在不刪除標籤欄的情況下將視圖推送/彈出視圖。

  • 我該如何做到這一點?
  • 只要我的MainWindow.xib關於所有這些控制器,IB的層次結構應該如何?
  • 這裏最好的做法是什麼?

非常感謝,

+3

直起特威特編碼器的嘴:http://stackoverflow.com/questions/576764/tab-bar-controller-inside-a-navigation -controller-or-sharing-a-navigation-root -v – chrissr 2010-02-26 02:48:17

回答

15

只需將視圖控制器包裹在UINavigationController內部並將UINavigationController置於UITabBar的內部即可。 這將罰款你...

例子:

NSMutableArray *tabBarViewControllers = [[NSMutableArray alloc] initWithCapacity:2]; 

tabBarController = [[UITabBarController alloc] init]; 
[tabBarController setDelegate:self]; 

UINavigationController *navigationController = nil; 
navigationController = [[UINavigationController alloc] initWithRootViewController:<Your View controller1>]; 
[tabBarViewControllers addObject:navigationController]; 
[navigationController release]; 
navigationController = nil; 

navigationController = [[UINavigationController alloc] initWithRootViewController:<Your View controller2>]; 
[tabBarViewControllers addObject:navigationController]; 
[navigationController release]; 
navigationController = nil; 

tabBarController = tabBarViewControllers; 
[tabBarViewControllers release]; 
tabBarViewControllers = nil; 
+0

這更有意義,每個視圖控制器可以有他們自己的導航控制器彈出/推視圖。謝謝! – barfoon 2010-02-26 17:13:39

+0

@Manjunath:通過這種方式,我無法用兩個不同名稱命名導航欄和選項卡欄項目。有沒有辦法做到這一點? – Sefran 2011-11-19 14:39:25

3

使用一個標籤欄應用程序嚮導,將其設置爲正常。在要添加導航控制器的任何選項卡中,使用該庫在XIB中創建它。我的XIB有:

- File's Owner   DescriptiveNameNavViewController 
- First Responder 
- View     UIVIew 
- Navigation Controller UINavigationController 
    - Navigation Bar  UINavigationBar 

請注意,視圖中沒有任何內容。有關UINavigationController附加到UIView的位置,請參閱下面的viewDidLoad。

在Tab的ViewController的頭文件中(我在這裏稱爲DescriptiveNameNavViewController - 這裏沒有特別的標準,但是我使用[Something] NavViewController來提醒我這個ViewController包含一個導航控制器, 。導航堆棧這是我在MainWindow.xib中設置嚮導生成設置一個UINavigationController * IBOutlet中具有附加給它的XIB導航控制器的控制器名稱):

@interface DescriptiveNameNavViewController : UIViewController { 
    UINavigationController *navigationController; 
} 
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController; 

@end 

在控制器對於DescriptiveNameNavViewController,可以這樣做:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[self view] addSubview:[navigationController view]]; 
    DescriptiveNameController *aController = [[[DescriptiveNameController alloc ] initWithNibName:@"DescriptiveNameController" bundle:nil ] autorelease]; 
    aController.title = @"Descriptive Title"; 

// 
// app stuff goes here. 
// 

    [self.navigationController pushViewController:aController animated:YES]; 
    [self.navigationController setDelegate:self]; 
} 

在DescriptiveNameNavViewController中設置委託是非常重要的,因爲否則,您將無法獲得您期望在DescriptiveNameViewController實例中調用的方法以及您推入導航控制器堆棧的任何其他內容。

在DescriptiveNameNavViewController,實現UINavigationControllerDelegate方法是這樣的:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if ([viewController respondsToSelector:@selector(viewDidAppear:)]) { 
     [viewController viewDidAppear:animated]; 
    } 
} 

,那將導致像你期望的消息得到傳播到UINavigationController的內部控制器。人們遇到的許多問題似乎都是因爲ViewDidAppear:或其他方法沒有在推送到NavigationController的ViewControllers上調用。

無論如何,讓我知道如果更多的細節會有所幫助。

+0

我跟着這個,它不工作。仍然沒有在概念層面得到這個。當我啓動應用程序並單擊第二個選項卡時,它只是加載視圖,而不是一個導航控制器。 此外,您在頭中缺少UINavigationControllerDelegate協議。爲什麼導航控制器在接口中定義爲IBOutlet,但屬性聲明中的IS? – barfoon 2010-02-26 16:34:58

+0

@property語句中只有一個IBOutlet,因爲這是通過接口構建器獲取的。這是一個空的宏。 如果您在第二個面板上顯示空白視圖,這是因爲在viewDidLoad中加載導航控制器不起作用。無論如何,如果chrissr的解決方案正在爲你工作,只要注意viewWill *和viewDid *方法不會傳播到你的子視圖,並且如果這樣就實現了委託。 (缺失的委託協議是一個錯誤的,但方法將被調用。) – corprew 2010-02-28 00:02:00

相關問題