将向导用于选项卡栏应用程序,并正常进行设置。在要添加导航控制器的任何选项卡中,使用库在 XIB 中创建它。我的 XIB 有:
- 文件的所有者 DescriptiveNameNavViewController
- 急救人员
- 查看 UIVIew
- 导航控制器 UINavigationController
- 导航栏 UINavigationBar
请注意,视图中没有任何内容。请参阅下面的 viewDidLoad,了解 UINavigationController 连接到 UIView 的位置。
在 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 中的 ViewController 上调用。
无论如何,如果更多细节有帮助,请告诉我。