¿Cómo agregar un botón a UINavigationBar?

Respuestas:

294

Código de muestra para configurar el rightbuttona 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];

Pero normalmente tendría un NavigationControllerque le permitirá escribir:

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
    style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;
Mads Mobæk
fuente
1
Recibo una advertencia sobre el estilo: parámetro -> advertencia: Problema semántico: conversión implícita del tipo de enumeración 'UIBarButtonSystemItem' a un tipo de enumeración diferente 'UIBarButtonItemStyle'
pojo
3
Debe ser initWithBarButtonSystemItem: UIBarButtonSystemItemDone para evitar la advertencia.
JordanC
2
En el ejemplo, no entiendo de dónde viene "bar". ¿Cuál es la propiedad de la barra superior predeterminada para un UINavigationItem?
aneuryzm
La variable de barra en la respuesta es cualquier barra de navegación que no esté administrada por un controlador de navegación. Si tiene un controlador de navegación, tiene una barra de navegación propia que administra; en este caso, cada controlador de vista que envíe al controlador de navegación debe configurar su propio elemento de navegación (que incluye la configuración de rightBarButtonItem en su propio elemento de navegación propiedad).
Vasiliy Kulakov
Para los lectores actuales, no creo que haya ninguna razón para llamar [rightbutton release]a ARC (que no existía en el momento en que se escribió este comentario originalmente).
carbocation
20

Las respuestas anteriores son buenas, pero me gustaría desarrollarlas con algunos consejos más:

Si desea modificar el título del botón de retroceso (la flecha-y que mira a la izquierda de la barra de navegación) DEBE hacerlo en el controlador de vista ANTERIOR, no en el que se mostrará. Es como decir "oye, si alguna vez presionas otro controlador de vista encima de este, llama al botón de retroceso" Atrás "(o lo que sea) en lugar del predeterminado".

Si desea ocultar el botón de retroceso durante un estado especial, como mientras se muestra un UIPickerView, use self.navigationItem.hidesBackButton = YES;y recuerde volver a configurarlo cuando deje el estado especial.

Si desea mostrar uno de los botones simbólicos especiales, use el formulario initWithBarButtonSystemItem:target:actioncon un valor comoUIBarButtonSystemItemAdd

Recuerde, el significado de ese símbolo depende de usted, pero tenga cuidado con las Pautas de interfaz humana. El uso de UIBarButtonSystemItemAdd para significar que eliminar un elemento probablemente hará que su solicitud sea rechazada.

Amagrammer
fuente
11

Añadiendo un botón personalizado a la barra de navegación (con imagen para buttonItem y especificando el método de acción (void) openView {} y).

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];
Oleh Kudinov
fuente
7

El siguiente ejemplo mostrará un botón con el título "Contacto" en la barra de navegación de la derecha. Su acción llama a un método llamado "contacto" desde el controlador de vista. Sin esta línea, el botón derecho no es visible.

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

ingrese la descripción de la imagen aquí

Tibidabo
fuente
3

En Swift 2, harías:

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

(No es un cambio importante) En Swift 4/5, será:

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

¿Por qué no usar lo siguiente? (Del botón Dibujar Atrás personalizado en la barra de navegación del 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];
Joe
fuente
0

rápido 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)
    }
venenoso
fuente