使用一個標籤欄應用程序嚮導,將其設置爲正常。在要添加導航控制器的任何選項卡中,使用該庫在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上調用。
無論如何,讓我知道如果更多的細節會有所幫助。
直起特威特編碼器的嘴: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