在不使用uinavigationcontroller的情况下将“完成”按钮添加到导航栏

时间:2011-07-18 18:43:02

标签: iphone objective-c xcode uinavigationcontroller uinavigationbar

我有一个视图控制器,我希望能够通过右上角解雇"完成"导航栏上的按钮。我没有使用uinavcontoller,但只是在我的viewDidLoad中添加了这样的导航栏:

  bar = [[UINavigationBar alloc] init];

在.h:

IBOutlet UINavigationBar *bar;

当然,连接IB上的导航栏。

然后我尝试在viewDidLoad中添加一个导航项,但没有任何反应:

rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonSystemItemDone target:nil action:nil];
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"Title"];
item.rightBarButtonItem = rightButton;
item.hidesBackButton = YES;
[bar pushNavigationItem:item animated:NO];

请注意 - 这里有几个问题,但没有人回答这个问题。

感谢您的帮助!

1 个答案:

答案 0 :(得分:9)

如果你已经在IB中拥有它,你将不希望在代码中分配/初始化该栏。这将创建它的第二个版本,消息可能会出现偏差。如果您将条形图放入IB中的视图中,最简单的方法是将“完成”按钮放在那里。首先,您将要使用UINavigationItem而不是UINavigationBar。将UIBarButtonItem拖到UINavigationItem的右侧,将文本从Item更改为Done,然后选择样式。然后,您将创建一个IBAction方法来执行您希望按钮执行的操作(关闭视图)。然后,只需将按钮的选择器(在IB中)连接到IBAction方法,这将完成您想要的操作。

如果您想要/需要以编程方式执行此操作,您只需使用以下内容。

rightButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissView:)];
navigationItem.rightBarButtonItem = rightButton;
[rightButton release];

您也需要dismissView:方法。

- (IBAction)dismissView:(id)sender {
    // do something;
}

编辑:要以编程方式执行此操作,首先要在头文件中添加导航栏

UINavigationBar *navBar;

如果您计划允许方向更改,则只需要执行此操作。由于您没有使用IB,因此无需将其作为插座,因此我们已在标题中完成。

在实施文件中,您要调用以下内容:

- (void)viewDidLoad {
    navBar = [[UINavigationBar alloc] init];
    UINavigationItem *navItem = [[[UINavigationItem alloc] initWithTitle:@"some title"] autorelease];
    UIBarButtonItem *done = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissView:)] autorelease];
    navItem.rightBarButtonItem = done;
    navBar.items = [NSArray arrayWithObject:navItem];
    [self.view addSubview:navBar];
}

- (void)viewDidAppear:(BOOL)animated {
    navBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44);
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    navBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44);
}

- (void)dealloc {
    [navBar release];
}

首先创建实例并将它们放在视图中。一旦出现视图并且程序已知帧大小,它就会调整导航栏的大小(进而调整其子视图的大小)到适当的大小。然后,只要方向改变,它就会相应地调整大小。我测试过这只是为了确保所有这些都是好的信息,它对我来说很好,所以它也应该对你有好处。希望它可以帮助你