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?
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;
Pour Swift 3
if let button = self.navigationItem.rightBarButtonItem {
button.isEnabled = false
button.tintColor = UIColor.clear
}`
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.
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];
}];
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
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):
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()
Enregistrer les éléments dans viewDidLoad ()
sav_settingItem = nav.leftBarButtonItems![0]
sav_logoItem = nav.leftBarButtonItems![1]
CACHER les mettre à zéro
nav.leftBarButtonItem = nil
nav.leftBarButtonItem = nil
Pour les montrer
if (nav.leftBarButtonItem == nil) {
nav.leftBarButtonItem = sav_settingItem
nav.leftBarButtonItems?.append(sav_logoItem)
return
}
Spectacle:
[self.navigationItem.rightBarButtonItem.customView setHidden:NO];
Cacher:
[self.navigationItem.rightBarButtonItem.customView setHidden:YES];
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é.
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"
}
Ma solution:
self.navigationItem.rightBarButtonItem.customView.hidden=NO;
Spectacle:
//set navigationItem tint color white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor whiteColor];
Cacher:
//set navigationItem tint clear white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor clearColor];
Vous pouvez utiliser le code ci-dessous:
self.navigationItem.rightBarButtonItem?.image = nil
self.navigationItem.rightBarButtonItem?.isEnabled = false
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]
Masquer
xxxButton.customView = UIView()
.__ ou
navigationItem.rightBarButtonItems?.remove(at: (navigationItem.rightBarButtonItems?.index(of:xxxButton)!)!)
Afficher
xxxButton.customView = nil
.__ ou
navigationItem.rightBarButtonItems?.insert(newElement: xxxButton, at:SOME_INDEX)
J'espère utile.
Cacher:
if let topItem = self.navigationController?.navigationBar.topItem {
topItem.rightBarButtonItem = nil
}
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!
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
Définissez le titre pour vider en premier et après la sélection, réglez à nouveau.