web-dev-qa-db-fra.com

Comment masquer dynamiquement un bouton à une vue?

Je voudrais masquer dynamiquement un bouton dans l'une de mes vues en fonction d'une certaine condition.

J'ai essayé d'ajouter du code au contrôleur de vue -viewWillAppear, pour masquer le bouton avant d'afficher la vue réelle, mais je ne sais toujours pas comment faire.

J'ai une référence au bouton via un IBOutlet, mais je ne sais pas comment avancer à partir d'ici. Pour référence, il s'agit d'une instance UIBarButtonItem.

36
jpm

Si vous essayez de masquer un UIBarButtonItem, vous devrez en fait modifier le contenu de la barre parent. S'il s'agit d'un UIToolBar, vous devrez définir le tableau d'éléments de la barre sur un tableau qui n'inclut pas votre élément.

NSMutableArray     *items = [[myToolbar.items mutableCopy] autorelease];
[items removeObject: myButton];
myToolbar.items = items;
54
Ben Gottlieb

Définissez l'élément de barre sur zéro.

Par exemple:

self.navigationItem.leftBarButtonItem = nil;
20
Rose

J'ai donc essayé l'approche gagnante de Ben, mais j'ai finalement trouvé que c'était mal pour moi - bien que je sois sûr que cela dépend de ce que vous essayez de faire. J'essayais d'afficher un bouton de barre de navigation dans certaines conditions uniquement, puis de le masquer dès que la condition n'était plus remplie (dans mon cas, c'est un bouton "Terminé" utilisé pour masquer le clavier associé à une UITextView. Il ne devrait être s’affiche lorsque l’utilisateur tape dans la vue texte). Mes étapes étaient les suivantes:

  1. J'ai ajouté un UIBarButtonItem en tant que propriété dans ma classe UIViewController. Je l'instancie dans la méthode initWithNibName.

  2. J'ai affecté la propriété UIBarButtonItem en tant que rightBarButtonItem dans la barre de navigation dès que l'utilisateur commence à taper dans la vue texte.

  3. J'ai défini la propriété UIBarButtonItem sur nil lorsque l'utilisateur a fini de taper.

Cela fonctionne comme un charme. J'ajoute quelques exemples de code ci-dessous.

Premier à instancier le bouton dans ma méthode d'initialisation du contrôleur de vue:

barButtonItemDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];

Ensuite, je l'ai défini comme le bouton de barre de droite dans la méthode déléguée qui est appelée dès que l'utilisateur commence à modifier la vue texte:

self.navigationItem.rightBarButtonItem=[self barButtonItemDone];

Enfin, lorsque le bouton lui-même est cliqué, une méthode appelée "done" est appelée et je mets juste le rightBarButtonItem à nil à l'intérieur de cette méthode:

self.navigationItem.rightBarButtonItem=nil;
11
Heather Shoemaker

Si tout ce que l'on essaie de cacher est le bouton de retour dans la barre de navigation, il existe un moyen plus simple:

self.navigationItem.hidesBackButton = YES;

Citation de la documentation du développeur:

hidesBackButton

Une valeur booléenne qui détermine si le bouton Précédent est masqué.

@property (nonatomic, assign) BOOL hidesBackButton

Discussion

OUI si le bouton de retour est masqué lorsque cet élément de navigation est l'élément supérieur; sinon, NON. La valeur par défaut est NO.

Disponibilité

Disponible dans iPhone OS 2.0 et versions ultérieures.

10
Sara

C'est un peu un hack, mais cela fonctionne dans mon cas (et il gère correctement l'espacement dynamique):

Cacher:

myButton.width = 0.1;

Montrer:

myButton.width = 0.0;

Une largeur de 0,0 est "largeur automatique", et avec une largeur de 0,1, le bouton disparaît totalement (pas même un "ruban" d'un bouton, même si je n'ai pas essayé cela sur un écran rétine).

7
Michael

Une autre solution hacky:

myButton.customView = [[UIView alloc] init];
5
jonnysamps

Cette réponse concerne les UIBarButtonItems basés sur du texte, cependant, le même concept pourrait également être appliqué à d'autres types de boutons. Notez que cela permettra à la fois de masquer et afficher à nouveau l'élément. La plupart des réponses ci-dessus (celles qui définissent la valeur du bouton sur zéro, par exemple, ne permettent pas de réafficher le bouton si cela est souhaité).

TL; DR:

if (shouldShowMyBarButtonItem) {
    self.myBarButtonItem.title = nil;
    self.myBarButtonItem.action = nil;
} else if (!shouldShowMyBarButtonItem) {
    self.myBarButtonItem.title = @"Title";
    self.myBarButtonItem.action = @selector(mySelector:);
}

La version longue:

L'UIBarButtonItem que j'essayais de cacher se trouve dans une UIToolbar, pas un UINavigationBar, donc toutes les suggestions qui accèdent aux propriétés barButtonItem de gauche (ou de droite) sur l'élément de navigation ne fonctionnent pas pour moi. En outre, comme indiqué ci-dessus, je souhaitais montrer à nouveau le bouton lorsque les circonstances changent.

La suggestion de Michael était la plus proche de travailler, cependant, avec iOS 7 au moins, il y avait encore un très petit ruban du bouton affiché qui était utilisable. Dans mon application, il était inacceptable de toucher l'élément alors qu'il n'était pas censé être disponible. Le code ci-dessus masque et, surtout, désactive le bouton.

J'appelle le code ci-dessus dans une méthode d'actualisation privée, qui est appelée lorsqu'un événement utilisateur se produit.

2
Michael DiStefano

La meilleure solution à cela est moins technique. Il vous suffit de créer votre barre de navigation normale (en haut) ou votre barre d'outils (en bas), mais sans le bouton optionnel. Créez ensuite une autre barre identique mais plus courte que vous placez ensuite sur la partie sur laquelle vous souhaitez le bouton optionnel et créez votre bouton optionnel sur cette deuxième barre plus courte.

Vous pouvez maintenant appeler hidden = YES sur l'ensemble de la barre supplémentaire.

Les barres se chevauchent parfaitement pour moi, votre kilométrage peut varier.

2
Marius

La réponse de Ben est techniquement correcte, bien que lorsque j'essaye sur ma barre d'outils UIT personnalisée, les éléments s'espacent d'une manière que je n'aime pas, car j'utilise des éléments UIBarButtonSystemItemFlexibleSpace.

Si vous souhaitez que vos autres articles restent au même endroit, vous devrez soit définir vos espaces flexibles sur des espaces fixes, soit essayer ce que j'ai fait:

[filterBarButton.customView setHidden:YES];

remarque: cela ne fonctionne que si votre UIBarButtonItem utilise des vues personnalisées.

1
Jon

Si vous ajoutez un UIButton au UIBarButtonItem plutôt que d'utiliser simplement le UIBarButtonItem.

Vous pouvez ensuite affecter UIButton.hidden à TRUE ou YES et elle (et la UIBarButtonItem) ne seront ni visibles ni actives.

J'espère que cela pourra aider.

1
Christopher Shortt

Voici ce que j'ai fait pour les éléments de bouton qui ne faisaient pas partie de la barre de navigation (où Blank.png est une image vierge que j'ai créée qui a la même taille que l'image qu'elle remplace):

theButton.enabled = NO;
theButton.image = [UIImage imageNamed: @"Blank.png"];
1
Gary Riley