web-dev-qa-db-fra.com

Comment masquer/afficher le bouton droit dans la barre de navigation

Je dois masquer le bouton droit dans la barre de navigation, puis l'afficher après que l'utilisateur a sélectionné certaines options.

Malheureusement, ce qui suit ne fonctionne pas:

NO GOOD: self.navigationItem.rightBarButtonItem.hidden = YES;  // FOO CODE

Y a-t-il un moyen?

36
Lauren Quantrell

Cachez le bouton en définissant la référence sur nil. Toutefois, si vous souhaitez le restaurer ultérieurement, vous devez vous en garder une copie afin de pouvoir le réaffecter.

UIBarButtonItem *oldButton = self.navigationItem.rightBarButtonItem;
[oldButton retain];
self.navigationItem.rightBarButtonItem = nil;

//... later
self.navigationItem.rightBarButtonItem = oldButton;
[oldButton release];

Personnellement, dans mes applications, je transforme mes boutons de navigation en propriétés @, afin de pouvoir les supprimer et les recréer à volonté.

//mycontroller.h
UIBarButtonItem *rightNavButton;
@property (nonatomic, retain) UIBarButtonItem *rightNavButton;

//mycontroller.m
@synthesize rightNavButton;
- (UIBarButtonItem *)rightNavButton {
    if (!rightNavButton) {
        rightNavButton = [[UIBarButtonItem alloc] init];
        //configure the button here
    }
    return rightNavButton;
}

//later, in your code to show/hide the button:
self.navigationItem.rightBarButtonItem = self.rightNavButton;
71
Matt J

Pour Swift 3 

if let button = self.navigationItem.rightBarButtonItem {
                    button.isEnabled = false
                    button.tintColor = UIColor.clear
                }`
10
richc

Définissez la référence sur nil:

current_controller_in_navcontroller.navigationItem.rightBarButtonItem =  nil;

Veillez également à appeler ceci dans le contrôleur actuellement affiché par navController, et non pour navController lui-même.

9
Stefan Ticu

Spectacle:

[self.navigationItem.rightBarButtonItem.customView setAlpha:1.0];

Cacher:

[self.navigationItem.rightBarButtonItem.customView setAlpha:0.0];

Vous pouvez même animer son affichage/masquage

[UIView animateWithDuration:0.2 animations:^{
        [self.navigationItem.rightBarButtonItem.customView setAlpha:1.0];

    }];
7
HugoMasterPL

Voici la solution de Matt mise à jour pour Storyboards & ARC. N'oubliez pas que les IBOutlets sont __weaks par défaut. Vous devez donc changer ce paramètre en fort pour qu'il ne soit pas publié trop tôt.

@interface MAGTableViewController () <UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UIBarButtonItem *rightBarButton;

@end

@implementation MAGTableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.navigationItem setRightBarButtonItem:nil];
}

- (IBAction)rightBarButtonItemTapped:(id)sender
{
    [self.view endEditing:YES];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self.navigationItem setRightBarButtonItem:self.rightBarButton];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self.navigationItem setRightBarButtonItem:nil];
}

@end
5
mmackh

Swift 2.2

Dans Swift 2.2, self.navigationItem ne fonctionne pas. Au lieu de cela, créez une sortie de NavigationItem (je l’ai nommée sous "nav") et utilisez-la.

De plus, la suggestion suivante ne fonctionnait pas pour moi avec Xcode 7.3 et Swift 2.2. 

 nav.leftBarButtonItem?.customView?.hidden = true

J'ai donc utilisé l'idée de @Matt J ci-dessus comme suit (j'ai 2 éléments à gauche):

  1. Créer des points de vente pour les éléments de la barre de navigation et des variables pour les stocker

    @IBOutlet weak var settingItem: UIBarButtonItem!
    @IBOutlet weak var logoItem: UIBarButtonItem!
    
    var sav_settingItem: UIBarButtonItem = UIBarButtonItem()
    var sav_logoItem: UIBarButtonItem = UIBarButtonItem()
    
  2. Enregistrer les éléments dans viewDidLoad ()

    sav_settingItem = nav.leftBarButtonItems![0]
    sav_logoItem = nav.leftBarButtonItems![1]
    
  3. CACHER les mettre à zéro

    nav.leftBarButtonItem = nil
    nav.leftBarButtonItem = nil
    
  4. Pour les montrer

    if (nav.leftBarButtonItem == nil) {
        nav.leftBarButtonItem = sav_settingItem
        nav.leftBarButtonItems?.append(sav_logoItem)
        return
    }
    
4
Zvi

Spectacle:

[self.navigationItem.rightBarButtonItem.customView setHidden:NO];

Cacher:

[self.navigationItem.rightBarButtonItem.customView setHidden:YES];
3
Amr Angry

Le crédit doit aller à apprenant pour cette réponse dont la réponse provient de cette question:

masquer et afficher le bouton gauche de la barre de navigation à la demande dans iOS-7

C'est la réponse, qui est beaucoup plus simple.

//hide and reveal bar buttons
-(void) hideAndDisableLeftNavigationItem
{
    [self.navigationItem.leftBarButtonItem setTintColor:[UIColor clearColor]];
    [self.navigationItem.leftBarButtonItem setEnabled:NO];
}

-(void) showAndEnableLeftNavigationItem
{
    [self.navigationItem.leftBarButtonItem setTintColor:[UIColor blueColor]];
    [self.navigationItem.leftBarButtonItem setEnabled:YES];
}

Ensuite, vous venez de référencer la méthode où vous en avez besoin, comme dans un (IBAction), comme ceci:

[self hideAndDisableLeftNavigationItem];//[self showAndEnableLeftNavigationItem]; to show again

J'ai essayé toutes les autres méthodes et aucune n'a fonctionné, même en référant mon bouton comme une @property (...) UIBarButtonItem.... et rien n'a fonctionné jusqu'à ce que je l'aie trouvé. 

3
App Dev Guy

Swift 2 :

Tour!

Cacher:

if let btn = self.tabBarController!.navigationItem.rightBarButtonItem {
        btn.enabled = false
        btn.title = ""
}

Spectacle:

if let btn = self.tabBarController!.navigationItem.rightBarButtonItem {
        btn.enabled = true
        btn.title = "ButtonName"
}
2
Vahid

Ma solution:

self.navigationItem.rightBarButtonItem.customView.hidden=NO;
1
kozla13

Spectacle:

//set navigationItem tint color white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor whiteColor];

Cacher:

//set navigationItem tint clear white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor clearColor];
0
jebin

Vous pouvez utiliser le code ci-dessous:

    self.navigationItem.rightBarButtonItem?.image = nil
    self.navigationItem.rightBarButtonItem?.isEnabled = false
0
Pankaj Jangid
  1. Supposons que vous puissiez référencer le bouton de barre spécifique en tant que variable xxxButton

(ouvrez l’Assistant-éditeur, Ctrl + Glissez le bouton xxx vers la classe YourViewController en tant que sortie "xxxButton").

ou vous pouvez utiliser quelque chose comme let xxxButton = navigationBar.buttons[1]

  1. Masquer xxxButton.customView = UIView() .__ ou navigationItem.rightBarButtonItems?.remove(at: (navigationItem.rightBarButtonItems?.index(of:xxxButton)!)!)

  2. Afficher xxxButton.customView = nil .__ ou navigationItem.rightBarButtonItems?.insert(newElement: xxxButton, at:SOME_INDEX)

J'espère utile.

0
osexp2003

Cacher:

if let topItem = self.navigationController?.navigationBar.topItem {
    topItem.rightBarButtonItem = nil
}
0
Stalker

Dans Swift 4 I propose une astuce pour afficher/masquer le bouton droit ou gauche:

Étape 1: Créez un bouton IBOutlet dans le contrôleur de vue:

@IBOutlet var navigationItemButton: UIBarButtonItem!

Étape 2: Créer une fonction du bouton Cacher:

func hideNavigationButton() {
    navigationItemButton.isEnabled = false
    navigationItemButton.tintColor = UIColor.clear
}

Étape 3: Fonction de création du bouton Afficher:

func showNavigationButton() {
    navigationItemButton.isEnabled = true
    navigationItemButton.tintColor = UIColor.white
}

Étape 4 : Appelez simplement les fonctions désirées, utilisez hideNavigationButton() pour masquer et showNavigationButton() pour afficher le bouton.

Cordialement!

0

Si vous n’avez qu’un seul bouton dans le côté droit, vous pouvez utiliser celui-ci,

self.navigationItem.rightBarButtonItem = nil;

Supposons que vous ayez plusieurs boutons de barre dans le côté droit, par exemple, vous avez deux éléments de bouton de barre (bouton de recherche et filtre) dans le côté droit de votre élément de navigation. Maintenant, les éléments du bouton de la barre de droite sont

self.navigationItem.rightBarButtonItems = [searchItem, filterItem]

et vous devez masquer que le bouton de recherche, vous pouvez utiliser comme,

self.navigationItem.rightBarButtonItems = [filterItem]

Maintenant, que se passe-t-il, vous pouvez complètement masquer le bouton de recherche de l'élément de navigation et l'élément de filtre vient à la place de l'élément de recherche

0
Hilaj

Définissez le titre pour vider en premier et après la sélection, réglez à nouveau.

0
Anil Kumar