0

所以这就是我制作导航栏的方式:

- (void)viewDidLoad
{
    [super viewDidLoad];
    UINavigationController *navBar = [[UINavigationController alloc] init];
    [navBar willMoveToParentViewController:self];
    navBar.view.frame = CGRectMake(0, 0, 320, 44);
    [self.view addSubview:navBar.view];
    [self addChildViewController:navBar];
    [navBar didMoveToParentViewController:self];
    ...

我读过的所有地方都说这是添加按钮的方式:

UIBarButtonItem *button = [[UIBarButtonItem alloc]initWithTitle:@"test" style:UIBarButtonItemStyleBordered target:self action:@selector(print_message:)];
self.navigationItem.rightBarButtonItem = button;
[button release];

但是该按钮不会显示在导航栏上。这段代码有什么问题?

4

2 回答 2

3

除非您正在构建自定义容器视图控制器(这是一种相对罕见的事情),否则您不应该在内容控制器的-viewDidLoad. 虽然它会为您提供导航栏,但您的视图控制器父子关系将是倒退的:您的内容控制器将包含导航控制器,而不是相反。

相反,您需要在应用程序的启动过程中更早地创建导航控制器 - 可能在您的应用程序委托中,或者在您的主​​故事板中(如果您正在使用一个)。确保新的导航控制器将您的内容控制器作为其根控制器(通常通过-initWithRootViewController:)。然后您的self.navigationItem配置将正常工作。

于 2013-08-22T21:17:04.560 回答
2

您应该以不同的方式创建导航栏:

在您的 xxxAppDelegate.m 中编辑此方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.

//This is the ViewController of the view you want to be the root
xxxViewController *tvc = [[xxxViewController alloc]init];

//Now you have to initialize a UINavigationController and set its RootViewController
UINavigationController *nvc = [[UINavigationController alloc]initWithRootViewController:tvc];

//Now set the RootViewController to the NavigationViewController
[[self window]setRootViewController:nvc];


self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}

所以现在你有了一个合适的 NavigationController。如果您在 viewDidLoad 方法中执行此操作,则每次重新加载视图时都会生成 NavigationController。

现在在您的 xxxViewController.m 中编辑您的 init 方法:

- (id)init
{
...
if (self) {
 //Create a UINavigationItem
 UINavigationItem *n = [self navigationItem];

 //Create a new bar button item 
 UIBarButtonItem *button = [[UIBarButtonItem alloc]initWithTitle:@"test"    style:UIBarButtonItemStyleBordered target:self action:@selector(print_message:)];
 [[self navigationItem]setRightBarButtonItem:button];
}
return self;
}

现在应该显示带有 UIBarButtonItem 的正确 NavigationBar。

于 2013-08-22T21:24:02.630 回答