¿Cómo agregar 2 botones en la barra de navegación UIN en el lado derecho sin IB?

86

¿Cómo puedo agregar 2 botones en el UINavigationBarsin XIB?
Los 2 botones deben estar alineados en el lado derecho del UINavigationBar.

Sé cómo puedo agregar un botón, pero ¿qué tal dos?

Alejandro
fuente

Respuestas:

142

Con iOS 5+ es tan fácil como:

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]];
domsom
fuente
Creo que también está disponible en iOS 5.
iAmd
1
¡Agradable y sencillo! También incluí el botón derecho existente (establecido en IB) UIBarButtonItem * btnCurrent = self.navigationItem.rightBarButtonItem;
Duncan
43

Me fijé código (véase más adelante) para agregar dos botones a la derecha de la navigationbar. Puede establecer en barStyle = -1lugar de subclasificar 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];
ma11hew28
fuente
esta fue la primera publicación que encontré que incluía una configuración adicional de la barra de herramientas que la hace funcionar con diferentes colores de fondo, gracias
Chris
Esta es la respuesta correcta para esta pregunta .... El código en este enlace funciona perfectamente ... hombre increíble ... salud ... :) Todas las demás respuestas de arriba son incorrectas y no funcionan
Sameera Chathuranga
La solución no funciona perfectamente cuando presenta navigationController como contentViewController de UIPopoverController. Cuando configura UIToolbar como una vista personalizada de leftBarButtonItem, el área táctil del segundo botón es incorrecta (desplazada a la izquierda, lo que significa que no se puede hacer clic en el lado derecho del segundo botón). Cuando se trata de rightBarButtonItem, el segundo botón se dibuja incorrectamente (solo se dibuja el lado izquierdo) ... En este caso, tendré que ceñirme al uso de UIToolbar personalizado como encabezado en lugar de UINavigationBar, creo ...
manicaesar
1
Uno de los trucos aquí es la tools.barStyle = -1línea: sin eso, hay algunos artefactos visuales si usa UIBarStyleBlack con translucent = YES. (Es decir, el color de fondo no coincide con el de la barra de navegación). ¿Se trata de una característica no documentada? Si es así, este código es algo frágil. No he visto eso en ninguna parte de los documentos.
ettore
28

Puede utilizar un botón de barra inicializado con una barra de herramientas como vista personalizada.

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];

Daría algo como esto:

texto alternativo

Nota: esta respuesta es obsoleta para iOS 6 o posterior

Nathan
fuente
3
@SameeraChathuranga no puede simplemente copiar y pegar este código sin hacer nada. Debes asegurarte de que 'self.editButtonItem' y 'someOtherButton' estén definidos en algún lugar primero ...
Nathan
¡Hola! Gracias por el fragmento. Usando eso, agregué dos botones con éxito, pero hay un pequeño problema. Aquí es como se ve. Como puede ver, se ve un borde ligeramente cuadrado alrededor de la barra de herramientas. ¿Cómo puedo eliminar esto y hacerlo perfecto como lo tiene en la captura de pantalla anterior? Gracias. :)
Isuru
Extraño, no obtengo el borde en el botón "agregar". Solo obtengo un borde si uso UIBarButtonStyles que no tienen un ícono.
pojo
23

Aquí está el ejemplo de trabajo de mi proyecto actual:

dos botones en la barra de navegación de UIN 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];
Adnan
fuente
18
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];
Gurpreet Singh
fuente
14

Rápido:

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)

Métodos para botones:

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

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

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

RÁPIDO

Puedes hacerlo rápido como este

        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){
        
        }
Dharmbir Singh
fuente
7

Puede crear una UIView y agregar dos botones en esa vista. Y agregue ese UIView como botón derecho :)

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

self.navigationItem.rightBarButtonItem = rightItem;
prakash
fuente
@NathanReed, debería ser self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: rightItem];(muestra de código de trabajo completo a continuación [por mí])
Adnan
7

La respuesta de Prakash también funciona en el generador de interfaces.

Arrastre a UIViewen UINavigationItem, luego puede poner varios UIButtoncomo hijos de esto UIViewy crear una jerarquía como esta:

Barra de navegación con jerarquía de 3 botones

Establezca el color de fondo del UIViewpara borrar y agregue algunas restricciones para centrar verticalmente los botones y fijar la posición horizontal. Aquí está el resultado que obtuve con cero línea de código:

Resultado en simulador

Axel Guilmin
fuente
1
¡Esto funciona! Para aquellos que están tan confundidos como yo, lo que hice fue reemplazar el elemento del botón de la barra con el UIView arrastrándolo al UINavigationItem como se describe. Después de eso, será exactamente lo mismo que arrastrar botones a su escena y agregar restricciones. Felicitaciones por esta solución porque sin ningún código ahora puedo hacer esto además de crear una transición a diferentes escenas simplemente arrastrando los botones en el guión gráfico :) ¡Gracias!
Bruce
2
Esto no es necesario en absoluto. Puede simplemente arrastrar los elementos del botón de la barra al botón de la barra derecha. Xcode 7.3.1
João Nunes
4

En SWIFT, puede agregar este código para configurar dos botones en el lado derecho (o izquierdo):

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

Aquí está el código Swift 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){

  }
Mannam Brahman
fuente
2

No es necesario agregar dos botones. Solo necesitas agregar

UIBarButtonSystemItemFlexibleSpace 

no

UIBarButtonSystemItemFixedSpace

y un botón, de modo que quede en el lado derecho.

Me gusta esto:

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];   
bruno
fuente
2
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;
SURESH SANKE
fuente
1

En caso de que alguien venga aquí, como yo, buscando una respuesta MonoTouch, no busque más allá de NavigationItem.RightBarButtonItemsarray.

Dan Abramov
fuente
1

en SWIFT:

(supongamos que tiene un controlador de navegación) en el controlador raíz use este código:

izquierda: ..

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

Correcto:

    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;

..

dónde:

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

}
ing.conti
fuente
0
    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)
    }
AG
fuente