如何在没有IB的情况下在右侧的UINavigationbar中添加2个按钮?

问题描述:

如何在没有XIB的情况下将2个按钮添加到UINavigationBar
2个按钮应该对齐在UINavigationBar的右侧。如何在没有IB的情况下在右侧的UINavigationbar中添加2个按钮?

我知道如何添加一个按钮,但如何处理两个?

您可以创建一个UIView并在该视图中添加两个按钮。 并添加的UIView作为右键:)

UIView* rightItem = [UIView alloc] initWithFrame:frame]; 
//Create UIButton1 b1 
//Create UIButton2 b2 
[rightItem addSubview:b1]; 
[rightItem addSubview:b2]; 

self.navigationItem.rightBarButtonItem = rightItem; 
+0

这使我的应用程序崩溃? – Nathan 2010-11-05 07:34:12

+0

@NathanReed,它应该是'self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightItem];'(下面的全部工作代码示例[由我]) – Adnan 2014-09-05 06:01:00

posted code(见下文)两个按钮添加到的导航栏的右侧。您可以设置barStyle = -1而不是继承UIToolbar

UIToolbar *tools = [[UIToolbar alloc] 
        initWithFrame:CGRectMake(0.0f, 0.0f, 103.0f, 44.01f)]; // 44.01 shifts it up 1px for some reason 
tools.clearsContextBeforeDrawing = NO; 
tools.clipsToBounds = NO; 
tools.tintColor = [UIColor colorWithWhite:0.305f alpha:0.0f]; // closest I could get by eye to black, translucent style. 
                   // anyone know how to get it perfect? 
tools.barStyle = -1; // clear background 
NSMutableArray *buttons = [[NSMutableArray alloc] initWithCapacity:3]; 

// Create a standard refresh button. 
UIBarButtonItem *bi = [[UIBarButtonItem alloc] 
    initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh:)]; 
[buttons addObject:bi]; 
[bi release]; 

// Create a spacer. 
bi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; 
bi.width = 12.0f; 
[buttons addObject:bi]; 
[bi release]; 

// Add profile button. 
bi = [[UIBarButtonItem alloc] initWithTitle:@"Profile" style:UIBarButtonItemStylePlain target:self action:@selector(goToProfile)]; 
bi.style = UIBarButtonItemStyleBordered; 
[buttons addObject:bi]; 
[bi release]; 

// Add buttons to toolbar and toolbar to nav bar. 
[tools setItems:buttons animated:NO]; 
[buttons release]; 
UIBarButtonItem *twoButtons = [[UIBarButtonItem alloc] initWithCustomView:tools]; 
[tools release]; 
self.navigationItem.rightBarButtonItem = twoButtons; 
[twoButtons release]; 
+0

这是我发现的第一篇文章,其中包括额外的工具栏设置这使得它与不同的背景颜色工作,谢谢 – Chris 2011-04-12 21:06:33

+0

这是这个问题的正确答案....代码在这个链接工作完美...你真棒男人...欢呼... :)所有其他答案在以上是错误的,不起作用 – 2011-09-27 06:23:22

+0

当您将navigationController作为UIPopoverController的contentViewController呈现时,解决方案无法正常工作。当您将UIToolbar设置为leftBarButtonItem的自定义视图时,第二个按钮的触摸区域不正确(向左移动,这意味着第二个按钮的右侧不可点击)。当涉及到rightBarButtonItem,第二个按钮绘制错误(只绘制左侧)...在这种情况下,我将不得不坚持使用自定义UIToolbar作为标题,而不是UINavigationBar我认为... – manicaesar 2012-01-17 12:03:26

您可以使用一个工具栏自定义视图初始化一个栏按钮。

UIToolbar* toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 103.0f, 44.01f)]; 
NSArray* buttons = [NSArray arrayWithObjects:self.editButtonItem, someOtherButton, nil]; 
[toolbar setItems:buttons animated:NO]; 
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:toolbar]; 

会看到这样的:

alt text

注:这个答案是过时的iOS 6或更高版本

+3

@SameeraChathuranga你不能只是复制和粘贴这段代码而不做任何事情。你必须确保'self.editButtonItem'&'someOtherButton'被首先定义在某处... – Nathan 2011-12-01 23:31:01

+0

嗨!感谢您的摘录。使用我成功添加了两个按钮,但有一个小问题。 [Here](http://s12.postimg.org/53x5je565/Screen_Shot_2013_05_31_at_4_46_35_PM.png)的外观。正如你所看到的,工具栏周围有一个方形的边框。我怎样才能删除它,并使其像上面截图中的那样无缝连接?谢谢。 :) – Isuru 2013-05-31 11:18:25

+0

奇怪,我没有得到“添加”按钮的边框。如果我使用没有图标的UIBarButtonStyles,我只会获得边框。 – pojo 2013-09-03 12:37:30

UINavigationBar *navBarView = [[UINavigationBar alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 320.0f, 42.0f)]; 
    navBarView.tintColor= [UIColor colorWithRed:90.0/255.0f green:53.0/255.0f blue:45.0/255.0f alpha:1.0]; 

    UIBarButtonItem *left=[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backView)]; 
    UIBarButtonItem *right=[[UIBarButtonItem alloc]initWithTitle:@"Save" style:UIBarButtonItemStylePlain target:self action:@selector(SaveImage)]; 
    UIBarButtonItem *Add=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(AddComment:)]; 

    UINavigationItem *navigationItem = [[UINavigationItem alloc] init]; 
    navigationItem.leftBarButtonItem = left; 
    NSMutableArray *buttonArray=[[NSMutableArray alloc]initWithCapacity:2]; 
    [buttonArray addObject:right]; 
    [buttonArray addObject:Add]; 
    navigationItem.rightBarButtonItems = buttonArray; 
    [navBarView pushNavigationItem:navigationItem animated:NO]; 
[self.view addSubView:navBarView]; 

万一有人来这里,像我,寻找一个MonoTouch的答案,看看没有比NavigationItem.RightBarButtonItems阵列进一步。

您不必添加两个按钮。你只需要添加

UIBarButtonSystemItemFlexibleSpace 

UIBarButtonSystemItemFixedSpace 

和一个按钮,所以,这将是在右侧。

像这样:

UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 40)]; 
toolbar.barStyle = UIBarStyleBlackTranslucent; 

UIBarButtonItem *spaceButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 

UIBarButtonItem *infoButtonItem1 = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(empresaTextFieldDone)];  

toolbar.items = [NSArray arrayWithObjects: spaceButton, infoButtonItem1, nil]; 

与iOS 5+是那么容易,因为:

UIBarButtonItem *btnShare = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(share)]; 
UIBarButtonItem *btnRefresh = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)]; 
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:btnShare, btnRefresh, nil]]; 
+0

我认为它也适用于iOS 5。 – iAmd 2013-06-10 07:50:08

+0

不错,简单!我还包括现有的右键(在IB中设置)UIBarButtonItem * btnCurrent = self.navigationItem.rightBarButtonItem; – Duncan 2013-12-04 10:26:36

+0

令人惊讶地仍然在iOS 9上工作 – Raptor 2015-11-11 10:52:13

在SWIFT

(假设你有一个导航控制器)在根控制器使用此代码:

左: ..

let leftBtn = UIBarButtonItem(title: "Do It", style: UIBarButtonItemStyle.Plain, 
     target: self, action: "doIt:") 
    leftBtn.tag=100 
    self.navigationItem.leftBarButtonItem = leftBtn 

权:

let rightView = UIView(frame: CGRectMake(0, 0, 100, 30)) 
    rightView.backgroundColor = UIColor.redColor() 

    let btn1 = UIButton(frame: CGRectMake(0,0,60, 20)) 
    btn1.setTitle("R1", forState: UIControlState.Normal) 
    btn1.tag=101 
    btn1.addTarget(self, action: "doIt:", forControlEvents: UIControlEvents.TouchUpInside) 
    rightView.addSubview(btn1) 

    let btn2 = UIButton(frame: CGRectMake(30,0,60, 20)) 
    btn2.setTitle("R2", forState: UIControlState.Normal) 
    btn2.tag=102 
    btn2.addTarget(self, action: "doIt:", forControlEvents: UIControlEvents.TouchUpInside) 
    rightView.addSubview(btn2) 


    let rightBtn = UIBarButtonItem(customView: rightView) 
    self.navigationItem.rightBarButtonItem = rightBtn; 

..

其中:

func doIt(sender: AnyObject!){ 
    let tag = sender.tag 

} 

这里是我当前的项目工作示例:

two buttons into the UINavigationbar rightBarButtonItem

UIButton *homeBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
[homeBtn setImage:[UIImage imageNamed:@"home-icon"] forState:UIControlStateNormal]; 
//[homeBtn addTarget:self action:@selector(home) forControlEvents:UIControlEventTouchUpInside]; 
[homeBtn setFrame:CGRectMake(0, 0, 32, 32)]; 

UIButton *settingsBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
[settingsBtn setImage:[UIImage imageNamed:@"settings-icon"] forState:UIControlStateNormal]; 
//[settingsBtn addTarget:self action:@selector(settings) forControlEvents:UIControlEventTouchUpInside]; 
[settingsBtn setFrame:CGRectMake(44, 0, 32, 32)]; 

UIView *rightBarButtonItems = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 76, 32)]; 
[rightBarButtonItems addSubview:homeBtn]; 
[rightBarButtonItems addSubview:settingsBtn]; 

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightBarButtonItems]; 

斯威夫特:

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Additional bar button items 
    let button1 = UIBarButtonItem(image: UIImage(named: "image1.png"), style: .Plain, target: self, action: "methodA") 
    let button2 = UIBarButtonItem(image: UIImage(named: "image2.png"), style: .Plain, target: self, action: "methodB") 
    let button3 = UIBarButtonItem(image: UIImage(named: "image3.png"), style: .Plain, target: self, action: "methodC") 

    navigationItem.leftItemsSupplementBackButton = true 
    navigationItem.setLeftBarButtonItem(button1, animated: true) 
    navigationItem.setRightBarButtonItems([button2, button3], animated: true) 

方法按钮:

func methodA() { 
    performSegueWithIdentifier("segA", sender: nil) 
} 

func methodB() { 
    performSegueWithIdentifier("segB", sender: nil) 
} 

func methodC() { 
    performSegueWithIdentifier("segC", sender: nil) 
} 

UIView* buttonsView= [[UIView alloc] initWithFrame:CGRectMake(10, 6, 84, 32)]; 
buttonsView.backgroundColor=[UIColor clearColor]; 

btn_back = [UIButton buttonWithType:UIButtonTypeCustom]; 
[btn_back addTarget:self action:@selector(backButtonClick) 
forControlEvents:UIControlEventTouchUpInside]; 
btn_back.frame = CGRectMake(0, 0, 32, 32); 
btn_back.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"close.png"]]; 

btn_help = [UIButton buttonWithType:UIButtonTypeCustom]; 
[btn_help addTarget:self action:@selector(helpButtonClick) 
forControlEvents:UIControlEventTouchUpInside]; 
btn_help.frame = CGRectMake(42, 0, 32, 32); 
btn_help.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"info.png"]]; 

[buttonsView addSubview:btn_back]; 
[buttonsView addSubview:btn_help]; 

segmentItem = [[UIBarButtonItem alloc] initWithCustomView:buttonsView]; 
self.navigationItem.rightBarButtonItem = segmentItem; 

在SWIFT,您可以添加以下代码来设置两个按钮右侧(或左侧):

self.navigationItem.rightBarButtonItems = [UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Action, target: self, action: "barButtonItemClicked"), UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: self, action: "barButtonItemClicked")] 

SWIFT

您可以在swift这样做

 var editImg : UIImage = UIImage(named: "plus")! 
     var searchImg : UIImage = UIImage(named: "search")! 

     var editBtn : UIBarButtonItem = UIBarButtonItem(image: editImg, style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editBtnPressed:")) 

     var searchBtn : UIBarButtonItem = UIBarButtonItem(image: searchImg, style: UIBarButtonItemStyle.Plain, target: self, action: Selector ("searchBtnPressed:")) 

     var buttons : NSArray = [editBtn, searchBtn] 

     self.navigationItem.rightBarButtonItems = buttons 

     func editBtnPressed(sender: AnyObject){ 

     } 

     func searchBtnPressed(sender: AnyObject){ 

     } 

Prakash响应也适用于界面构建器。

将在UINavigationItem一个UIView,那么你可以把几个UIButton因为这UIView的孩子,并创建一个层次,像这样:

Navigation bar with 3 buttons hierarchy

设置UIView的背景色来清除,并添加一些垂直居中按钮和固定水平位置的限制。这是我与零线的代码得到的结果:

Result in simulator

+1

这工程!对于那些和我一样困惑的人,我所做的就是用UIView替换Bar Button Item,而不是像前面所描述的那样将它拖到UINavigationItem中。之后,它将完全相同,例如将按钮拖到场景中并添加约束。因为没有任何代码,我现在可以做到这一点,并通过在故事板中拖动按钮来创建对不同场景的延续:)谢谢! – Bruce 2015-07-26 07:45:40

+2

这根本不需要。您只需将条形按钮项目拖动到右侧的条形按钮即可。 Xcode 7.3.1 – 2016-05-11 16:23:09

func makeCustomNavigationBar() { 

     // Create the navigation bar 
     let navigationBar = UINavigationBar(frame: CGRectMake(0, 20, self.view.frame.size.width, 44)) // Offset by 20 pixels vertically to take the status bar into account 
     navigationBar.backgroundColor = UIColor.init(hexString: "E43037") 
     navigationBar.delegate = self; 

     navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default) 
     navigationBar.shadowImage = UIImage() 
     navigationBar.translucent = true 

     // Create a navigation item with a title 
     let navigationItem = UINavigationItem() 
     navigationBar.tintColor = UIColor.whiteColor() 

     navigationItem.title = "Forgot Password" 
     navigationBar.titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()] 

     // Create left and right button for navigation item 
     let leftButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: self, action: nil) 
     leftButton.action = "returnToLoginView" 

     let backbuttonImageView = UIImageView(frame: CGRectMake(0, 0, 30, 30)) 
     backbuttonImageView.image = UIImage(named: "nav-arrow-left") 
     leftButton.image = backbuttonImageView.image 
     navigationItem.leftBarButtonItem = leftButton 


let rightButton = UIBarButtonItem(title: "Right", style: UIBarButtonItemStyle.Plain, target: self, action: nil) 
     rightButton.action = "navigateToDashBoardView" 

     let rightButtonImageView = UIImageView(frame: CGRectMake(0, 0, 30, 30)) 
     rightButtonImageView.image = UIImage(named: "nav-arrow-left") 
     rightButton.image = backbuttonImageView.image 
     navigationItem.rightBarButtonItem = rightButton 

     // Assign the navigation item to the navigation bar 
     navigationBar.items = [navigationItem] 

     // Make the navigation bar a subview of the current view controller 
     self.view.addSubview(navigationBar) 
    } 

这里是斯威夫特4码:

let editImage = UIImage(named: "plus")! 
    let searchImage = UIImage(named: "search")! 
    let editButton = UIBarButtonItem(image: editImage, style: .plain, target: self, action:#selector(didTapEditButton)) 
    let searchButton = UIBarButtonItem(image: searchImage, style: .plain, target: self, action:#selector(didTapSearchButton)) 
    navigationItem.rightBarButtonItems = [editButton, searchButton] 


@objc func didTapEditButton(sender: AnyObject){ 

    } 

@objc func didTapSearchButton(sender: AnyObject){ 

    }