Come aggiungere un pulsante a UINavigationBar?


Risposte:


294

Codice di esempio per impostare rightbuttonsu a 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];

Ma normalmente avresti un NavigationController, che ti consente di scrivere:

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

1
Ottengo un avviso sullo stile: parametro -> avviso: Semantic Problema: conversione implicita dal tipo di enumerazione 'UIBarButtonSystemItem' al diverso tipo di enumerazione 'UIBarButtonItemStyle'
pojo

3
Dovrebbe essere initWithBarButtonSystemItem: UIBarButtonSystemItemDone per evitare l'avviso.
JordanC

2
Nell'esempio, non capisco da dove provenga "bar". Qual è la proprietà predefinita della barra superiore per un UINavigationItem?
aneuryzm

La variabile bar nella risposta è qualsiasi barra di navigazione non gestita da un controller di navigazione. Se si dispone di un controller di navigazione, ha una propria barra di navigazione che gestisce: in questo caso, ogni controller di visualizzazione che si preme sul controller di navigazione deve configurare il proprio elemento di navigazione (che include l'impostazione di rightBarButtonItem nel proprio elemento di navigazione proprietà).
Vasiliy Kulakov

Per i lettori attuali, non credo ci sia alcun motivo per chiamare [rightbutton release]sotto ARC (che non esisteva al momento in cui questo commento è stato originariamente scritto).
carbocationia

20

Le risposte sopra sono buone, ma mi piacerebbe arricchirle con alcuni suggerimenti in più:

Se vuoi modificare il titolo del pulsante indietro (la freccia che guarda quello a sinistra della barra di navigazione) DEVI farlo nel controller di visualizzazione PRECEDENTE, non quello per il quale verrà visualizzato. È come dire "ehi, se mai spingi un altro controller di visualizzazione sopra questo, chiama il pulsante Indietro" Indietro "(o qualsiasi altra cosa) invece di quello predefinito."

Se desideri nascondere il pulsante Indietro durante uno stato speciale, ad esempio durante la visualizzazione di un UIPickerView, utilizza self.navigationItem.hidesBackButton = YES;e ricorda di reimpostarlo quando esci dallo stato speciale.

Se si desidera visualizzare uno dei pulsanti simbolici speciali, utilizzare il modulo initWithBarButtonSystemItem:target:actioncon un valore simileUIBarButtonSystemItemAdd

Ricorda, il significato di quel simbolo dipende da te, ma fai attenzione alle Linee guida dell'interfaccia umana. L'uso di UIBarButtonSystemItemAdd per indicare l'eliminazione di un elemento probabilmente farà rifiutare la tua applicazione.


11

Aggiunta di un pulsante personalizzato alla barra di navigazione (con l'immagine per buttonItem e specificando il metodo di azione (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];

7

L'esempio seguente visualizzerà un pulsante con il titolo "Contatto" sulla barra di navigazione a destra. La sua azione chiama un metodo chiamato "contact" dal viewcontroller. Senza questa linea il pulsante destro non è visibile.

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

inserisci qui la descrizione dell'immagine


3

In Swift 2, faresti:

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

(Non un cambiamento importante) In Swift 4/5, sarà:

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

2

Perché non utilizzare quanto segue: (da Disegna pulsante Indietro personalizzato sulla barra di navigazione di 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

rapido 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)
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.