Используйте мастер для приложения панели вкладок и настройте его как обычно. На любой вкладке, где вы хотите добавить контроллер навигации, создайте его в XIB с помощью библиотеки. Мой XIB имеет:
- File's Owner DescriptiveNameNavViewController
- First Responder
- View UIVIew
- Navigation Controller UINavigationController
- Navigation Bar UINavigationBar
Обратите внимание, что в представлении нет ничего. См. ViewDidLoad ниже, где UINavigationController присоединяется к UIView.
В заголовочном файле для 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: или другие методы не вызываются для ViewControllers, помещенных в NavigationController.
В любом случае, дайте мне знать, если помогут более подробные сведения.