我一直在看到这个问题并通过在代码中手动创建UINavigationController来解决它。当我从XIB的属性检查器添加导航栏时,有人可以告诉我 - >将顶部栏设置为黑色导航栏,它会显示在XIB中,但是当我运行程序时,它不会出现!我注意到self.NavigationController来了,所以我在我的XIB中添加了UINavigationController并分配了NIB,但它仍然没有!这有什么不对?我需要任何其他设置吗?
[EDIT1]
我尝试像下面一样添加它并且它可以工作,但我希望父类自动将旋转和外观事件转发给子控制器。如果我遵循它就不会发送它们因为我将nvc添加为子而不是marketsListViewController。所以我认为我必须继承UINavigationController。见EDIT2。
self.marketsListViewController = [[MarketsListViewController alloc] initWithNibName:@"MarketsListViewController" bundle:nil];
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:self.marketsListViewController];
nvc.navigationBar.barStyle = UIBarStyleBlack;
[self.marketsListView addSubview:nvc.view];
[self addChildViewController:nvc];
[nvc didMoveToParentViewController:self];
[EDIT2]
我已将MarketsListViewController子类化为UINavigationController,并认为以下内容可行,但它并不适用。它只显示导航栏,UITableView无法显示!
self.marketsListViewController = [[MarketsListViewController alloc] initWithNibName:@"MarketsListViewController" bundle:nil];
self.marketsListViewController.navigationBar.barStyle = UIBarStyleBlack;
[self.marketsListView addSubview:self.marketsListViewController.view];
[self addChildViewController:self.marketsListViewController];
[self.marketsListViewController didMoveToParentViewController:self];
[EDIT3]
我在Edit1中错误地认为,当我将child添加为导航控制器的根控制器时,子控制器不会获得旋转事件。家长仍然会自动发送所有活动,这就是我想要的! :)
答案 0 :(得分:3)
当我从XIB添加导航栏时,有人可以告诉我 属性检查器 - >它将顶部栏设置为黑色导航栏 显示在XIB中,但是当我运行程序时,它不会出现!
您在.xib文件中看到的就是帮助您正确布局并快速了解它的外观。如果您的应用程序使用导航栏,则该栏几乎总是由导航视图控制器(UINavigationController
)管理。导航控制器托管的视图控制器不会担心导航栏 - 它们的视图层次结构位于栏下方的空间中。
因此,在您的应用中获取导航栏的正确方式几乎肯定会使用导航控制器。如果您只有一个视图控制器,请使导航控制器的根视图控制器(注意:窗口的根视图控制器将是导航视图控制器)。您可以通过设置导航栏的样式来更改视图控制器中栏的外观:
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
更新:在您发布的代码中,您只是创建了一个新的导航控制器,但没有对其进行任何操作。我在上面提到的事实是(在大多数情况下)导航控制器应该是窗口的根视图控制器。在代码中创建导航控制器很好,但是你通常会在app delegate中创建它,一旦你创建了它,你就会将它设置为窗口的根视图控制器。这是从Xcode的主/详细模板(没有故事板)制作的新项目中借来的一个例子:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MMMasterViewController" bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
return YES;
}
请注意,在创建窗口和导航控制器之后,代码会将导航控制器设置为窗口的根视图控制器。