Comment ajouter un bouton à UINavigationBar?

Réponses:

294

Exemple de code pour définir le rightbuttonsur un 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];

Mais normalement vous auriez un NavigationController, vous permettant d'écrire:

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
    style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;
Mads Mobæk
la source
1
Je reçois un avertissement sur le style: paramètre -> avertissement: problème sémantique: conversion implicite du type d'énumération 'UIBarButtonSystemItem' en type d'énumération différent 'UIBarButtonItemStyle'
pojo
3
Cela doit être initWithBarButtonSystemItem: UIBarButtonSystemItemDone pour éviter l'avertissement.
JordanC
2
Dans l'exemple, je ne comprends pas d'où vient "bar". Quelle est la propriété de la barre supérieure par défaut pour un UINavigationItem?
aneuryzm
La variable de barre dans la réponse est toute barre de navigation qui n'est pas gérée par un contrôleur de navigation. Si vous avez un contrôleur de navigation, il possède sa propre barre de navigation qu'il gère - dans ce cas, chaque contrôleur de vue que vous poussez vers le contrôleur de navigation doit configurer son propre élément de navigation (qui comprend la définition de rightBarButtonItem dans sa propre navigationItem propriété).
Vasiliy Kulakov
Pour les lecteurs actuels, je ne pense pas qu'il y ait de raison d'appeler [rightbutton release]sous ARC (qui n'existait pas au moment où ce commentaire a été écrit à l'origine).
carbocation
20

Les réponses ci-dessus sont bonnes, mais j'aimerais les étoffer avec quelques conseils supplémentaires:

Si vous souhaitez modifier le titre du bouton de retour (la flèche-y regardant celle à gauche de la barre de navigation), vous DEVEZ le faire dans le contrôleur de vue PRÉCÉDENT, et non dans celui pour lequel il s'affichera. C'est comme dire "hé, si jamais vous poussez un autre contrôleur de vue par-dessus celui-ci, appelez le bouton de retour" Retour "(ou autre chose) au lieu de la valeur par défaut."

Si vous souhaitez masquer le bouton de retour pendant un état spécial, par exemple lorsqu'un UIPickerView est affiché, utilisez self.navigationItem.hidesBackButton = YES;et n'oubliez pas de le réinitialiser lorsque vous quittez l'état spécial.

Si vous souhaitez afficher l'un des boutons symboliques spéciaux, utilisez le formulaire initWithBarButtonSystemItem:target:actionavec une valeur telle queUIBarButtonSystemItemAdd

N'oubliez pas que la signification de ce symbole dépend de vous, mais faites attention aux directives de l'interface humaine. L'utilisation de UIBarButtonSystemItemAdd pour signifier la suppression d'un élément entraînera probablement le rejet de votre demande.

Amagrammer
la source
11

Ajout d'un bouton personnalisé à la barre de navigation (avec image pour buttonItem et spécification de la méthode d'action (void) openView {} et).

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
la source
7

L'exemple ci-dessous affichera un bouton avec un titre "Contact" dans la barre de navigation à droite. Son action appelle une méthode nommée "contact" depuis le viewcontroller. Sans cette ligne, le bouton droit n'est pas visible.

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

entrez la description de l'image ici

Tibidabo
la source
3

Dans Swift 2, vous feriez:

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

(Pas un changement majeur) Dans Swift 4/5, ce sera:

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

Pourquoi ne pas utiliser ce qui suit: (à partir du bouton Dessiner le bouton Retour personnalisé sur la barre de navigation de l'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
la source
0

rapide 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
la source