1

我一直看到这个问题并通过在代码中手动创建 UINavigationController 来解决它。有人可以告诉我,当我从 XIB 的属性检查器添加导航栏 - > 将顶部栏设置为黑色导航栏时,它会显示在 XIB 中,但是当我运行程序时,它不会出现!我注意到 self.NavigationController 即将为零,所以我在我的 XIB 中添加了 UINavigationController 并分配了 NIB,但它仍然为零!这有什么问题?我需要任何其他设置吗?

[编辑1]

我尝试像下面那样添加它并且它可以工作,但我希望父类自动将旋转和外观事件转发给子控制器。如果我关注它,它不会发送它们,因为我将 nvc 添加为子元素而不是市场列表视图控制器。所以我想我必须继承 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];

[编辑2]

我已将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];

[编辑3]

我在 Edit1 中错了,当我将子控制器添加为导航控制器的根控制器时,子控制器不会获得旋转事件。父母仍然自动发送所有事件,这就是我想要的!:)

添加了来自 XIB 的导航栏

4

1 回答 1

3

有人可以告诉我,当我从 XIB 的属性检查器添加导航栏 - > 将顶部栏设置为黑色导航栏时,它会显示在 XIB 中,但是当我运行程序时,它不会出现!

您在 .xib 文件中看到的内容只是为了帮助您正确布局并很好地了解它的外观。当您的应用程序使用导航栏时,导航栏几乎总是由导航视图控制器 ( UINavigationController) 管理。导航控制器托管的视图控制器不担心导航栏——它们的视图层次结构位于导航栏下方的空间中。

因此,在您的应用程序中获取导航栏的正确方法几乎可以肯定是使用导航控制器。如果您只有一个视图控制器,则将其设为导航控制器的根视图控制器(注意:窗口的根视图控制器将是导航视图控制器)。您可以通过设置导航栏的样式从视图控制器更改栏的外观:

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

更新:在您发布的代码中,您只是创建了一个新的导航控制器,但没有对它做任何事情。我在上面提到了一个事实,即(在大多数情况下)导航控制器应该是窗口的根视图控制器。在代码中创建导航控制器很好,但您通常会在应用程序委托中进行,一旦创建它,​​您会将其设置为窗口的根视图控制器。这是一个从 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;
}

请注意,在创建窗口和导航控制器之后,代码将导航控制器设置为窗口的根视图控制器。

于 2012-10-25T14:19:54.437 回答