如何将按钮添加到UINavigationBar?


Answers:


294

rightbutton上设置的示例代码NavigationBar

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

但通常情况下,您会有一个NavigationController,使您可以编写:

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
    style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;

1
我收到有关样式的警告:参数->警告:语义问题:从枚举类型'UIBarButtonSystemItem'隐式转换为不同的枚举类型'UIBarButtonItemStyle'–
pojo

3
这应该是initWithBarButtonSystemItem:UIBarButtonSystemItemDone以避免警告。
JordanC 2011年

2
在示例中,我不知道“酒吧”的来源。UINavigationItem的默认顶部栏属性是什么?
aneuryzm 2012年

答案中的bar变量是不受导航控制器管理的任何导航条。如果您有导航控制器,则它具有自己管理的导航栏-在这种情况下,您推送到导航控制器的每个视图控制器都应配置自己的导航项(包括在自己的navigationItem中设置rightBarButtonItem属性)。
Vasiliy Kulakov 2014年

对于当前的读者,我认为没有任何理由可以[rightbutton release]在ARC下进行调用(在撰写此评论时还没有出现)。
碳化2014年

20

上面的答案很好,但是我想补充一些技巧:

如果要修改后退按钮的标题(导航栏左侧的箭头Y箭头),则必须在PREVIOUS视图控制器中进行操作,而不是将其显示的按钮。这就像在说“嘿,如果您将另一个视图控制器推到该视图控制器之上,则将后退按钮称为“后退”(或其他按钮),而不是默认按钮。

如果要在特殊状态下(例如显示UIPickerView时)隐藏“后退”按钮,请使用 self.navigationItem.hidesBackButton = YES;,请在离开特殊状态时并记住将其重新设置。

如果要显示特殊的符号按钮之一,请使用以下形式 initWithBarButtonSystemItem:target:action具有以下值UIBarButtonSystemItemAdd

请记住,该符号的含义取决于您,但请注意《人机界面指南》。使用UIBarButtonSystemItemAdd表示删除项目可能会使您的应用程序被拒绝。


11

将自定义按钮添加到导航栏(按钮项目的图像并指定操作方法(void)openView {}和)。

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 32, 32);
[button setImage:[UIImage imageNamed:@"settings_b.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(openView) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *barButton=[[UIBarButtonItem alloc] init];
[barButton setCustomView:button];
self.navigationItem.rightBarButtonItem=barButton;

[button release];
[barButton release];

7

下面的示例将在右侧的导航栏上显示一个标题为“联系人”的按钮。它的操作从视图控制器中调用一个名为“ contact”的方法。如果没有此行,则右键不可见。

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Contact"
                                                                          style:UIBarButtonItemStylePlain target:self action:@selector(contact:)];;

在此处输入图片说明


3

在Swift 2中,您可以执行以下操作:

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = rightButton

(不是重大更改)在Swift 4/5中,它将是:

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = rightButton

2

为什么不使用以下内容:(从iPhone导航栏上的“绘制自定义后退”按钮

// Add left
UINavigationItem *previousItem = [[UINavigationItem alloc] initWithTitle:@"Back title"];
UINavigationItem *currentItem = [[UINavigationItem alloc] initWithTitle:@"Main Title"];
[self.navigationController.navigationBar setItems:[NSArray arrayWithObjects:previousItem, currentItem, nil] animated:YES];

// set the delegate to self
[self.navigationController.navigationBar setDelegate:self];

0

迅捷3

    let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(cancelPressed(_:)))
    cancelBarButton.setTitleTextAttributes( [NSFontAttributeName : UIFont.cancelBarButtonFont(),
                                                          NSForegroundColorAttributeName : UIColor.white], for: .normal)
    self.navigationItem.leftBarButtonItem = cancelBarButton


    func cancelPressed(_ sender: UIBarButtonItem ) {
        self.dismiss(animated: true, completion: nil)
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.