Comment afficher / masquer un UIBarButtonItem?

251

J'ai créé une barre d'outils dans IB avec plusieurs boutons. Je voudrais pouvoir masquer / afficher l'un des boutons en fonction de l'état des données dans la fenêtre principale.

UIBarButtonItem n'a pas de propriété cachée, et tous les exemples que j'ai trouvés jusqu'à présent pour les masquer impliquent de définir les boutons de la barre de navigation sur zéro, ce que je ne pense pas que je veux faire ici parce que je devrai peut-être afficher à nouveau le bouton (pas de mentionner que, si je connecte mon bouton à un IBOutlet, si je le mets à zéro, je ne sais pas comment je le récupérerai).

Sasha
la source
Je l'ai simplement désactivé et ajouté une étiquette d'accessibilité indiquant que la fonction du bouton n'est pas disponible.
Daniel Springer

Réponses:

263

Enregistrez votre bouton dans une prise solide (appelons-le myButton) et faites-le pour l'ajouter / le supprimer:

// Get the reference to the current toolbar buttons
NSMutableArray *toolbarButtons = [self.toolbarItems mutableCopy];

// This is how you remove the button from the toolbar and animate it
[toolbarButtons removeObject:self.myButton];
[self setToolbarItems:toolbarButtons animated:YES];

// This is how you add the button to the toolbar and animate it
if (![toolbarButtons containsObject:self.myButton]) {
    // The following line adds the object to the end of the array.  
    // If you want to add the button somewhere else, use the `insertObject:atIndex:` 
    // method instead of the `addObject` method.
    [toolbarButtons addObject:self.myButton];
    [self setToolbarItems:toolbarButtons animated:YES];
}

Parce qu'il est stocké dans la prise, vous en garderez une référence même lorsqu'il n'est pas dans la barre d'outils.

lnafziger
la source
73
Pour que cela fonctionne pour mon bouton droit dans un contrôleur de navigation, j'ai utilisé self.navigationItem.rightBarButtonItems et [self.navigationItem setRightBarButtonItems <prams>] au lieu de toolBarItems et setToolBarItems.
MindSpiker
@MindSpiker: Oui, la même technique fonctionne également pour les boutons d'une barre de navigation.
lnafziger
1
dois-je nil myButton dans dealloc?
Van Du Tran
49
Ou Apple aurait pu ajouter une propriété .hidden. -_-
GeneCode
217

Je sais que cette réponse est en retard pour cette question. Cependant, cela pourrait aider si quelqu'un d'autre fait face à une situation similaire.

Dans iOS 7, pour masquer un élément de bouton de barre, nous pouvons utiliser les deux techniques suivantes: -

  • utiliser SetTitleTextAttributes: - Cela fonctionne très bien sur les éléments de bouton de barre comme "Terminé", "Enregistrer" etc. Cependant, cela ne fonctionne pas sur les éléments comme Ajouter, Symbole de corbeille, etc. (du moins pas pour moi) car ce ne sont pas des textes.
  • utiliser TintColor: - Si j'ai un élément de bouton de barre appelé "deleteButton": -

Pour masquer le bouton, j'ai utilisé le code suivant: -

[self.deleteButton setEnabled:NO]; 
[self.deleteButton setTintColor: [UIColor clearColor]];

Pour afficher à nouveau le bouton, j'ai utilisé le code suivant: -

[self.deleteButton setEnabled:YES];
[self.deleteButton setTintColor:nil];
Max
la source
[self.navigationItem.rightBarButtonItem setEnabled: NO]; [self.navigationItem.rightBarButtonItem setTintColor: [UIColor clearColor]];
Leon
3
Pour Swift: deleteButton.enabled = false; deleteButton.tintColor = UIColor.clearColor()pour désactiver et masquer, et deleteButton.enabled = true; deleteButton.tintColor = nilpour réactiver et afficher comme d'habitude.
Unixmonkey
1
J'aime que cette approche me permette de mettre la logique pour afficher ou non l'UIBarButton à l'intérieur de cette classe. La raison pour laquelle cela ne fonctionne qu'avec un seul bouton n'est pas immédiatement évidente - c'est parce que si vous masquez un bouton de cette façon, il prendra toujours de la place, donc vous pourriez avoir un espace vide si vous avez plusieurs boutons.
SimplGy
Votre première approche était parfaite pour moi. Je mets UIColor.clearpour UIControlState.disabledet d' afficher / masquer le bouton avec setEnabled. Bien sûr, comme vous l'avez dit, cela ne fonctionne que pour les boutons de texte.
fl034
Si j'appuie longuement dessus jusqu'à ce qu'il apparaisse dans une grande image (probablement pour l'accessibilité), même avec isEnabled réglé sur false, cela fonctionne toujours.
Daniel Springer
67

Voici une approche simple:

hide:  barbuttonItem.width = 0.01;
show:  barbuttonItem.width = 0; //(0 defaults to normal button width, which is the width of the text)

Je viens de l'exécuter sur mon iPad rétine, et .01 est assez petit pour qu'il ne s'affiche pas.

Drew Rosenberg
la source
13
De toutes les solutions, celle-ci était rapide, sale et efficace. J'ai également ajouté barbuttItem.enabled = NO; car je pouvais toujours faire tirer le bouton si je le frappais suffisamment.
Stickley
1
Ça ne marche pas pour moi. Je pensais que c'était parce que j'utilisais un bouton Ajouter avec l'image '+', mais j'ai essayé un bouton personnalisé avec le texte "Nouveau" à la place et il ne disparaît toujours pas. L'activation change donc je sais que mon code est en cours d'exécution. Des idées? Notez que ce bouton est créé dans un storyboard et a un enchaînement, donc je ne veux pas passer à un bouton programmatique à la place
Rhubarbe
19
Il ne semble pas fonctionner dans une barre d'outils du contrôleur de navigation, mais il le fait pour d'autres barres d'outils.
Drew Rosenberg
3
Il le cache mais il répond toujours aux coups. Pour moi, il agit comme un bouton invisible.
Tibidabo
Si vous avez défini la couleur de teinte globale en utilisant cette ligne self.window?.tintColor = APP_PRIMARY_COLORdans appdelegate, cela ne fonctionnera pas
Mehul Thakkar
60

Il est possible de masquer un bouton en place sans modifier sa largeur ou le retirer de la barre. Si vous définissez le style en clair, supprimez le titre et désactivez le bouton, il disparaîtra. Pour le restaurer, inversez simplement vos modifications.

-(void)toggleBarButton:(bool)show
{
    if (show) {
        btn.style = UIBarButtonItemStyleBordered;
        btn.enabled = true;
        btn.title = @"MyTitle";
    } else {
        btn.style = UIBarButtonItemStylePlain;
        btn.enabled = false;
        btn.title = nil;
    }
}
Eli Burke
la source
2
Cela a fonctionné pour moi en définissant simplement btn.title = nil. Je mets également enabled = NO, juste au cas où ...
Pork 'n' Bunny
3
Définir le bouton ButtonItem.title sur nil n'a pas fonctionné pour moi dans iOS7. Le bouton n'est pas réapparu lors de sa réinitialisation. Cependant, ce qui a fonctionné a été la définition de buttonItem.title = @ "";
Mark Knopper
42

Voici ma solution bien que je la cherchais pour la barre de navigation.

navBar.topItem.rightBarButtonItem = nil;

Ici "navBar" est un IBOutlet à la NavigationBar dans la vue en XIB Ici, je voulais cacher le bouton ou l'afficher en fonction d'une condition. Donc, je teste la condition dans "If" et si true, je définis le bouton sur nil dans la méthode viewDidLoad de la vue cible.

Cela peut ne pas être exactement lié à votre problème, mais quelque chose de similaire dans le cas où vous souhaitez masquer les boutons sur la barre de navigation

vishal dharankar
la source
Si vous souhaitez définir à rightBarButtonItemnouveau ultérieurement , assurez-vous que l'élément de bouton est stocké dans une IBOutlet solide afin qu'il ne soit pas libéré lorsque vous le retirez de la barre de navigation.
Nate
30

Pour Swift 3 et Swift 4, vous pouvez le faire pour masquer UIBarButtomItem:

self.deleteButton.isEnabled = false
self.deleteButton.tintColor = UIColor.clear

Et pour montrer UIBarButtonItem:

self.deleteButton.isEnabled = true
self.deleteButton.tintColor = UIColor.blue

Sur le, tintColorvous devez avoir à spécifier la couleur d'origine que vous utilisez pour leUIBarButtomItem

pableiros
la source
2
Mais cela prendra encore de la place pour ce bouton.
Makalele
22

J'utilise actuellement OS X Yosemite Developer Preview 7 et Xcode 6 beta 6 ciblant iOS 7.1 et la solution suivante fonctionne bien pour moi:

  • Créer une sortie pour UINavigationItemet UIBarButtonItems
  • Exécutez le code suivant pour supprimer

    [self.navItem setRightBarButtonItem:nil];
    [self.navItem setLeftBarButtonItem:nil];
  • Exécutez les codes suivants pour ajouter à nouveau des boutons

    [self.navItem setRightBarButtonItem:deleteItem];
    [self.navItem setLeftBarButtonItem:addItem];
Olcay Ertaş
la source
Merci, c'est aussi la meilleure méthode que j'ai trouvée. Assurez-vous simplement que vos références à vos boutons sont solides.
jyoung
Gardez également à l'esprit que cela ne fonctionne que si vous n'avez qu'un seul bouton. L'exemple supprimera TOUS les boutons de ce côté.
lnafziger
@jyoung Cela a fonctionné pour moi, mais pourquoi est-ce important si la référence est forte? Je n'ai pas essayé dans l'autre sens, mais en général je ne le fais pas de cette façon car ce n'est pas la valeur par défaut.
Robert
@Robert Vous souhaitez utiliser l'objet ultérieurement, vous devez donc vous assurer que l'objet ne sera pas récupéré lorsque vous le définissez sur nil. Si rien d'autre ne retenait l'objet lorsque vous avez dit à l'élément de bouton de barre qu'il était correct de s'en débarrasser, son compte de référence serait de 0 et ce serait de la collecte des ordures.
2015
14

J'ai utilisé IBOutlets dans mon projet. Donc ma solution était:

@IBOutlet weak var addBarButton: UIBarButtonItem!

addBarButton.enabled = false
addBarButton.tintColor = UIColor.clearColor()

Et lorsque vous devrez à nouveau afficher cette barre, définissez simplement les propriétés inversées.

Dans Swift 3,enable utilisez plutôt la isEnablepropriété.

Tanière
la source
13

self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];

Dmitry Semenyuk
la source
12

iOS 8. UIBarButtonItem avec image personnalisée. J'ai essayé de nombreuses façons différentes, la plupart d'entre elles n'aidaient pas. La solution de Max setTintColorne changeait en aucune couleur. J'ai compris celui-ci moi-même, pensant qu'il serait utile à quelqu'un.

Pour se cacher:

[self.navigationItem.rightBarButtonItem setEnabled:NO];
[self.navigationItem.rightBarButtonItem setImage:nil];

Pour montrer:

[self.navigationItem.rightBarButtonItem setEnabled:YES];
[self.navigationItem.rightBarButtonItem setImage:image];
Rinto Rapheal
la source
9

Essayez dans Swift , ne mettez pas à jour tintColorsi vous avez un design pour votre UIBarButtonItem comme la taille de la police dans AppDelegate, cela changera totalement l'apparence de votre bouton lors de votre apparition.

Dans le cas d'un bouton texte, le changement de titre peut faire disparaître votre bouton.

if WANT_TO_SHOW {
    myBarButtonItem.enabled = true
    myBarButtonItem.title = "BUTTON_NAME"
}else{
    myBarButtonItem.enabled = false
    myBarButtonItem.title = ""
}
Jeffrey Neo
la source
7

J'ai découvert une autre ride dans l' approche tintColoret isEnabledsuggérée par Max et d'autres - lorsque VoiceOver est activé pour l'accessibilité et que le bouton est logiquement caché, le curseur d'accessibilité se concentrera toujours sur le bouton de la barre et indiquera qu'il est "grisé" (c'est-à-dire parce qu'il isEnabledest défini sur false). L'approche dans la réponse acceptée ne souffre pas de cet effet secondaire, mais un autre travail que j'ai trouvé consistait à définir la valeur isAccessibilityElementfalse lors du "masquage" du bouton:

deleteButton.tintColor = UIColor.clear
deleteButton.isEnabled = false
deleteButton.isAccessibilityElement = false

Et puis isAccessibilityElementrevenir à true lorsque vous "montrez" le bouton:

deleteButton.tintColor = UIColor.blue
deleteButton.isEnabled = true
deleteButton.isAccessibilityElement = true

Le fait que l'élément du bouton de barre occupe toujours de l'espace n'était pas un problème dans mon cas, car nous masquions / montrions la partie la plus à gauche des éléments de bouton de barre de droite.

Evan Kirkwood
la source
6
@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {

    var isHidden: Bool = false {

        didSet {

            isEnabled = !isHidden
            tintColor = isHidden ? UIColor.clear : UIColor.black
        }
    }
}

Et maintenant, changez simplement la isHiddenpropriété.

Bartłomiej Semańczyk
la source
5

Amélioration de la réponse de @lnafziger

Enregistrez vos Barbuttons dans une prise solide et faites-le pour le cacher / le montrer:

-(void) hideBarButtonItem :(UIBarButtonItem *)myButton {
    // Get the reference to the current toolbar buttons
    NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];

    // This is how you remove the button from the toolbar and animate it
    [navBarBtns removeObject:myButton];
    [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
}


-(void) showBarButtonItem :(UIBarButtonItem *)myButton {
    // Get the reference to the current toolbar buttons
    NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];

    // This is how you add the button to the toolbar and animate it
    if (![navBarBtns containsObject:myButton]) {
        [navBarBtns addObject:myButton];
        [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
    }
}

Lorsque nécessaire, utilisez la fonction ci-dessous.

[self showBarButtonItem:self.rightBarBtn1];
[self hideBarButtonItem:self.rightBarBtn1];
umakanta
la source
5

Il suffit de définir barButton.customView = UIView()et de voir l'astuce

Jeff ayan
la source
Ce que cette réponse fait, c'est de permettre à tous les dimensionnements flexibles de fonctionner. C'est en fait une réponse super efficace. Probablement couplé à une extension ce serait parfait.
Adrian_H
4

Il n'y a aucun moyen de "masquer" un UIBarButtonItem, vous devez le supprimer de la superView et l'ajouter à nouveau lorsque vous souhaitez l'afficher à nouveau.

Kyle Richter
la source
Ce n'est en fait pas vrai - la méthode décrite par Max fonctionne bien.
northernman
1
nothernman - Max n'est pas vraiment correct. Il ne cache pas réellement le bouton de la façon dont la plupart des gens définiraient "cacher". Il le rend simplement invisible et désactive l'interaction avec l'utilisateur. Le bouton est toujours là et prend de la place. Cela se résume à la façon dont vous voulez définir "cacher", je crois que l'esprit de la question d'origine voulait réellement le supprimer / l'ajouter, pas seulement le rendre invisible.
Michael Peterson
4

C'est loin dans la liste des réponses, mais juste au cas où quelqu'un voudrait un copier-coller facile pour la solution rapide, le voici

func hideToolbarItem(button: UIBarButtonItem, withToolbar toolbar: UIToolbar) {
    var toolbarButtons: [UIBarButtonItem] = toolbar.items!
    toolbarButtons.removeAtIndex(toolbarButtons.indexOf(button)!)
    toolbar.setItems(toolbarButtons, animated: true)
}

func showToolbarItem(button: UIBarButtonItem, inToolbar toolbar: UIToolbar, atIndex index: Int) {
    var toolbarButtons: [UIBarButtonItem] = toolbar.items!
    if !toolbarButtons.contains(button) {
        toolbarButtons.insert(button, atIndex: index)
        toolbar.setItems(toolbarButtons, animated:true);
    }
}
maninvan
la source
Pas mal mais vous devez donner un UINavigationItem en paramètre et non UIToolbar car il demande de cacher un UIBarButtonItem. J'ai modifié votre fonction en ceci: func hideToolbarItem (bouton: UIBarButtonItem, withToolbar toolbar: UINavigationItem) {var toolbarButtons: [UIBarButtonItem] = toolbar.rightBarButtonItems! toolbarButtons.removeAtIndex (toolbarButtons.indexOf (button)!) toolbar.setRightBarButtonItems (toolbarButtons, animated: true)} et cela fonctionne très bien
Kingalione
3

Une façon de le faire est d'utiliser la initWithCustomView:(UIView *)propriété de lors de l'allocation du fichier UIBarButtonItem. La sous-classe pour UIViewaura la propriété hide / unhide.

Par exemple:

1. Ayez un fichier UIButtonque vous souhaitez masquer / afficher.

2. Créez la UIButtonvue personnalisée. Comme :

UIButton*myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];//your button

UIBarButtonItem*yourBarButton=[[UIBarButtonItem alloc] initWithCustomView:myButton];

3. Vous pouvez masquer / afficher le fichier que myButtonvous avez créé.[myButton setHidden:YES];

iNoob
la source
Cependant, cela ne comblera pas l'écart entre les autres boutons: lorsqu'il est "caché", il y aura une zone vide sur la barre d'outils.
lnafziger
@lnafziger Oui, c'est vrai, mais je n'ai pas lu la mention OP sur la réduction de l'écart entre les boutons, mais c'est un bon point à noter cependant.
iNoob
1
Merci, votre réponse est également utile, mais je pense que la plupart des gens qui souhaitent masquer un bouton dans une barre d'outils veulent qu'il ne soit pas là du tout (sans la zone vide). Si c'est la gauche ou la droite, cela n'aurait pas vraiment d'importance.
lnafziger
Bons points, iNoob et Inafziger - je ne l'ai pas mentionné de toute façon mais oui, je préférerais qu'il n'y ait pas un espace vide.
Sasha
3

Pour la version Swift, voici le code:

Pour UINavigationBar:

self.navigationItem.rightBarButtonItem = nil

self.navigationItem.leftBarButtonItem = nil
Sohil R. Memon
la source
2

Définir la couleur du texte sur une couleur claire lorsque l'élément de bouton de barre est désactivé est probablement une option plus propre. Il n'y a aucune bizarrerie que vous devez expliquer dans un commentaire. De plus, vous ne détruisez pas le bouton, vous conservez donc toutes les séquences de storyboard associées.

[self.navigationItem.rightBarButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor clearColor]}
                                                      forState:UIControlStateDisabled];

Ensuite, lorsque vous voulez que l'élément du bouton de barre soit masqué, vous pouvez simplement faire:

self.navigationItem.rightBarButton.enabled = NO;

C'est boiteux, il n'y a pas de propriété cachée mais cela offre le même résultat.

chiot
la source
1
J'avais un bouton dans le rightBarButtonItem. J'ai donc réglé son activé sur NO et changé son image sur l'état désactivé à zéro. A fonctionné comme un charme ... Merci
Skywalker
excellente idée, mais mettre l'image à zéro n'a pas fonctionné pour moi, j'ai dû mettre un petit carré transparent de 20x20 comme image
Lena Bru
2

Dans le cas où UIBarButtonItem a une image au lieu du texte, vous pouvez le faire pour le masquer: navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;

Artem Goryaev
la source
2

Quelques méthodes d'assistance que je pensais partager en fonction de la réponse acceptée par lnafziger car j'ai plusieurs barres d'outils et plusieurs boutons dans chacune:

-(void) hideToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar{
    NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
    [toolbarButtons removeObject:button];
    [toolbar setItems:toolbarButtons animated:NO];
}

-(void) showToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar atIndex:(int) index{
    NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
    if (![toolbarButtons containsObject:button]){
        [toolbarButtons insertObject:button atIndex:index];
        [self setToolbarItems:toolbarButtons animated:YES];
    }
}
Guy Lowe
la source
2

Vous pouvez facilement obtenir la vue et la masquer de cette façon

let view: UIView = barButtonItem.valueForKey("view") as! UIView
view.hidden = true
Titouan de Bailleul
la source
2

Si vous utilisez Swift 3

if (ShowCondition){
   self.navigationItem.rightBarButtonItem = self.addAsset_btn 
 } 
else {
   self.navigationItem.rightBarButtonItem = nil
 }
Museer Ahamad Ansari
la source
2

Voici une extension qui va gérer cela.

extension UIBarButtonItem {

    var isHidden: Bool {
        get {
            return tintColor == .clear
        }
        set {
            tintColor = newValue ? .clear : .white //or whatever color you want
            isEnabled = !newValue
            isAccessibilityElement = !newValue
        }
    }

}

USAGE:

myBarButtonItem.isHidden = true
Harris
la source
1

En complément de la réponse d'Eli Burke, si vous avez UIBarButtonItemune image d'arrière-plan au lieu d'un titre, vous pouvez utiliser le code:

-(void)toggleLogoutButton:(bool)show{
    if (show) {
        self.tabButton.style = UIBarButtonItemStyleBordered;
        self.tabButton.enabled = true;
        UIImage* imageMap = [UIImage imageNamed:@"btn_img.png"];
        [((UIButton *)[self.tabButton customView]) setBackgroundImage:imageMap forState:UIControlStateNormal];
    } else {
        self.tabButton.style = UIBarButtonItemStylePlain;
        self.tabButton.enabled = false;
        [((UIButton *)[self.tabButton customView]) setBackgroundImage:nil forState:UIControlStateNormal];
    }
}
Renato Lochetti
la source
0

Vous devez manipuler le tableau toolbar.items.

Voici un code que j'utilise pour masquer et afficher un bouton Terminé. Si votre bouton est sur le bord extrême de la barre d'outils ou entre d'autres boutons, vos autres boutons se déplaceront, donc si vous voulez que votre bouton disparaisse, placez-le comme dernier bouton vers le centre. J'anime le déplacement du bouton pour l'effet, j'aime bien.

-(void)initLibraryToolbar {

    libraryToolbarDocumentManagementEnabled = [NSMutableArray   arrayWithCapacity:self.libraryToolbar.items.count];
    libraryToolbarDocumentManagementDisabled = [NSMutableArray arrayWithCapacity:self.libraryToolbar.items.count];
    [libraryToolbarDocumentManagementEnabled addObjectsFromArray:self.libraryToolbar.items];
    [libraryToolbarDocumentManagementDisabled addObjectsFromArray:self.libraryToolbar.items];
    trashCan = [libraryToolbarDocumentManagementDisabled objectAtIndex:3];
    mail = [libraryToolbarDocumentManagementDisabled objectAtIndex:5];
    [libraryToolbarDocumentManagementDisabled removeObjectAtIndex:1];
    trashCan.enabled = NO;
    mail.enabled = NO;
    [self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:NO];

}

maintenant vous pouvez utiliser le code suivant pour afficher votre bouton

[self.libraryToolbar setItems:libraryToolbarDocumentManagementEnabled animated:YES];
trashCan.enabled = YES;
mail.enabled = YES; 

ou pour cacher votre bouton

[self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:YES];
trashCan.enabled = NO;
mail.enabled = NO;
Graham
la source
0

Dans IB, si vous laissez le titre du bouton vide, il n'apparaîtra pas (jamais initialisé?). Je le fais souvent pendant le développement pendant les mises à jour de l'interface utilisateur si je veux qu'un élément de bouton de barre disparaisse temporairement pour une génération sans le supprimer et mettre à la corbeille toutes ses références de sortie.

Cela n'a pas le même effet pendant l'exécution, si vous définissez le titre du bouton sur zéro, le bouton entier ne disparaîtra pas. Désolé ne répond pas vraiment à votre question, mais peut être utile à certains.

Edit: cette astuce ne fonctionne que si le style du bouton est défini sur plain

bretzels1337
la source
0

J'ajouterai ma solution ici car je ne la trouve pas encore mentionnée ici. J'ai un bouton dynamique dont l'image dépend de l'état d'un contrôle. La solution la plus simple pour moi était de régler l'image sur nilsi le contrôle n'était pas présent. L'image a été mise à jour à chaque mise à jour du contrôle et donc, c'était optimal pour moi. Juste pour être sûr que je l'ai également réglé enabledsur NO.

La définition de la largeur sur une valeur minimale n'a pas fonctionné sur iOS 7.

mkko
la source
0

Avec crédit à @lnafziger, @MindSpiker, @vishal, et. Al,

La doublure la plus simple à laquelle je suis arrivé pour un seul bouton de barre droite (ou gauche) est:

self.navigationItem.rightBarButtonItem = <#StateExpression#>
    ? <#StrongPropertyButton#> : nil;

Un péché:

@interface MyClass()

@property (strong, nonatomic) IBOutlet UIBarButtonItem *<#StrongPropertyButton#>;

@end

@implementation

- (void) updateState
{
    self.navigationItem.rightBarButtonItem = <#StateExpression#>
        ? <#StrongPropertyButton#> : nil;
}

@end

J'ai testé cela et cela fonctionne pour moi (avec l'élément de bouton de barre robuste câblé via IB).

Chris Conover
la source
Cela fonctionnera si vous n'avez qu'un seul bouton, mais si vous avez plusieurs boutons, vous devrez utiliser une méthode plus conforme à ma réponse.
lnafziger