2012-10-25 129 views
1

我一直在看到这个问题,并通过在代码中手动创建UINavigationController来解决它。有人可以告诉我,当我从XIB的Attribute Inspector - > Set Top bar添加到黑色导航栏时,它会显示在XIB中,但是当我运行程序时,它不会出现!我注意到self.NavigationController到了零,所以我在我的XIB中添加了UINavigationController并分配了NIB,但仍然是零!这有什么问题?我是否需要其他设置?iOS:从XIB添加导航栏

[EDIT1]

我尝试添加像下面和它的作品,但我想父类自动转发的旋转和外观事件,孩子控制器。如果我遵循它将不会发送它们,因为我将nvc添加为child而不是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,孩子控制器不会得到旋转活动时,我添加子作为导航控制器的根控制器。家长仍然自动发送所有事件,这就是我想要的! :)

Added navigation bar from XIB

回答

3

可能有人请告诉我,当我从厦门国际银行的 添加导航栏属性检查器 - >黑导航条设置顶栏,它会在厦门国际银行显示 但是当我运行程序,它不会出现!

您在.xib文件中看到的内容就是为了帮助您正确地设计布局并获得它的外观。当您使用导航栏的应用程序时,该栏几乎总是由导航视图控制器(UINavigationController)管理。导航控制器托管的视图控制器不用担心导航栏 - 它们的视图层次结构会进入栏下方的空间。

所以,正确的方式来获得您的应用程序中的导航栏几乎肯定是使用导航控制器。如果您只有一个视图控制器,请确保导航控制器的根视图控制器(注意:窗口的根视图控制器将成为导航视图控制器)。

self.navigationController.navigationBar.barStyle = UIBarStyleBlack; 

更新:在您发布的代码,你只是创建一个新的导航控制器,但没有做任何事情,你可以通过设置导航栏的风格改变,从您的视图控制器栏的外观用它。我之前提到的事实是(在大多数情况下)导航控制器应该是窗口的根视图控制器。在代码中创建导航控制器是很好的,但通常在应用程序委托中完成,一旦创建它,​​就会将其设置为窗口的根视图控制器。下面是从一个项目借用一个例子从Xcode的主/从模板制成新鲜(SANS故事板):

- (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; 
} 

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

+0

谢谢@Celeb清除我的怀疑!我编辑了这个问题。请看一看。我在容器视图中有很多屏幕,并且它们中的一些具有导航栏。 MarketsListViewController是问题中显示在XIB中的视图控制器。 Self代表容器视图控制器。 – applefreak

+0

嗨@Celeb不幸的是我不能在AppDelegate中做它,因为它不是我唯一的视图控制器。父(容器)视图控制器没有导航栏。它有大约8-10个子控制器,其中的几个必须有导航栏来启用嵌套视图。但无论如何,我认为我更接近解决方案。如果您看到Edit1,它可以工作,但我无法使用它,因为我希望子控制器能够自动接收父代转发的旋转事件。所以我有我的视图控制器的子类UINavigationController并做了同样的事情,但不行!它只显示导航栏! – applefreak

+0

@AppleDeveloper对不起,我无法清楚地了解你要在这里做什么。对UINavigationController进行子类化并不常见 - 这可能不是正确的做法。如果您还没有,我强烈建议您阅读“视图控制器编程指南”。 – Caleb