Como adicionar um botão ao UINavigationBar?

Respostas:

294

Código de exemplo para definir o rightbuttonem um 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];

Mas normalmente você teria um NavigationController, permitindo que você escreva:

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
    style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;
Mads Mobæk
fonte
1
Recebo um aviso sobre o estilo: parâmetro -> aviso: Problema semântico: conversão implícita do tipo de enumeração 'UIBarButtonSystemItem' para tipo de enumeração diferente 'UIBarButtonItemStyle'
pojo
3
Deve ser initWithBarButtonSystemItem: UIBarButtonSystemItemDone para evitar o aviso.
JordanC
2
No exemplo, não entendo de onde vem "bar". Qual é a propriedade padrão da barra superior para um UINavigationItem?
aneuryzm
A variável bar na resposta é qualquer barra de navegação que não seja gerenciada por um controlador de navegação. Se você tiver um controlador de navegação, ele possui uma barra de navegação própria que gerencia - neste caso, cada controlador de visualização que você empurra para o controlador de navegação deve configurar seu próprio item de navegação (que inclui a configuração de rightBarButtonItem em seu próprio navigationItem propriedade).
Vasiliy Kulakov
Para os leitores atuais, não acredito que haja qualquer razão para ligar para [rightbutton release]ARC (que não existia na época em que este comentário foi escrito originalmente).
carbocátion
20

As respostas acima são boas, mas gostaria de aprofundá-las com mais algumas dicas:

Se você quiser modificar o título do botão Voltar (a seta apontando para a esquerda da barra de navegação), DEVE fazê-lo no controlador de visualização ANTERIOR, não naquele para o qual será exibido. É como dizer "ei, se você colocar outro controlador de visualização em cima deste, chame o botão Voltar de" Voltar "(ou qualquer outro) em vez do padrão."

Se você quiser ocultar o botão Voltar durante um estado especial, como enquanto um UIPickerView é exibido, use self.navigationItem.hidesBackButton = YES;e lembre-se de defini-lo de volta ao sair do estado especial.

Se você quiser exibir um dos botões simbólicos especiais, use o formulário initWithBarButtonSystemItem:target:actioncom um valor comoUIBarButtonSystemItemAdd

Lembre-se de que o significado desse símbolo é com você, mas tome cuidado com as Diretrizes de Interface Humana. Usar UIBarButtonSystemItemAdd para significar a exclusão de um item provavelmente fará com que seu aplicativo seja rejeitado.

Amagrammer
fonte
11

Adicionando botão personalizado à barra de navegação (com imagem para buttonItem e especificando o método de ação (void) openView {} e).

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
fonte
7

O exemplo abaixo exibirá um botão com o título "Contato" na barra de navegação à direita. Sua ação chama um método denominado "contato" do viewcontroller. Sem esta linha, o botão direito não é visível.

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

insira a descrição da imagem aqui

Tibidabo
fonte
3

No Swift 2, você faria:

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

(Não é uma grande mudança) No Swift 4/5, será:

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

Por que não usar o seguinte: (do botão Voltar personalizado Desenhar na barra de navegação do 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
fonte
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)
    }
venky
fonte