web-dev-qa-db-fra.com

est-il possible de mettre à jour le titre / texte d'UIButton par programmation?

J'ai un UIButton qui, lorsqu'il est pressé, ouvre une nouvelle vue dans laquelle l'utilisateur peut modifier certains paramètres. Lorsque la vue est supprimée, j'aimerais mettre à jour le titre/texte de UIButton pour refléter le nouvel état. J'appelle:

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
[myButton setTitle: @"myTitle" forState: UIControlStateApplication];
[myButton setTitle: @"myTitle" forState: UIControlStateHighlighted];
[myButton setTitle: @"myTitle" forState: UIControlStateReserved];
[myButton setTitle: @"myTitle" forState: UIControlStateSelected];
[myButton setTitle: @"myTitle" forState: UIControlStateDisabled];

Mais cela ne semble jamais changer par rapport au texte/titre original spécifié dans IB.

93
George Armhold

Le bouton est-il spécifié en tant qu'IBOutlet dans votre classe de contrôleur de vue et est-il correctement connecté en tant que prise dans Interface Builder (faites glisser la souris d'une nouvelle prise de référencement vers le propriétaire du fichier et sélectionnez votre objet UIButton)? C'est généralement le problème que j'ai quand je vois ces symptômes.


Edit: Bien que ce ne soit pas le cas ici, quelque chose comme ceci peut aussi arriver si vous définissez un titre attribué au bouton, alors vous essayez de changer le titre et non le titre attribué.

51
Ken Pespisa

J'ai résolu le problème en définissant le paramètre title pour UIControlStateNormal, et cela fonctionne automatiquement sur les autres états. Le problème semble être lorsque vous définissez un autre UIControlState.

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
110
Yotes

J'ai découvert un autre problème. Il s’agit peut-être d’un bogue introduit dans iOS 5, mais j’ai pensé que je le signalerais à quiconque l’aurait rencontré.

Si vous ne définissez aucun texte par défaut pour le bouton dans XIB, aucun texte n'apparaîtra si vous le définissez par programme. Et si vous définissez du texte dans le fichier XIB, tout texte que vous affecterez ensuite au bouton par programme sera tronqué à la taille du texte par défaut.

Et enfin, si vous affichez la vue avec votre bouton, puis appelez une autre vue (comme une ActionSheet) et que vous la fermez, le texte que vous avez affecté au bouton par programme sera effacé et la légende du bouton retournera à ce que vous avez défini. dans le XIB.

13
Oscar

Bien que le problème de Caffeine Coma ait été résolu, j'aimerais proposer une autre cause potentielle pour que le titre ne soit pas présenté sur un UIButton.

Si vous définissez une image pour le UIButton en utilisant

- (void)setImage:(UIImage *)image forState:(UIControlState)state

Il peut couvrir le titre. J'ai découvert cela à la dure et imaginez que certains d'entre vous finissent par lire cette page pour la même raison.

Utilisez cette méthode à la place

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state

pour l'image du bouton et le titre ne sera pas affecté.

J'ai testé cela avec des boutons créés par programme et des boutons créés dans un fichier .xib

12
Jesse Black

À partir de Swift 4:

    button.setTitle("Click", for: .normal)
11
Vlad Spreys

pour Swift:

button.setTitle("Swift", forState: UIControlState.Normal)                   
7
Dara Tith

Il s'avère que les docs vous disent la réponse! UIButton ignorera le changement de titre s'il a déjà une chaîne attribuée à utiliser (avec semble être la valeur par défaut que vous obtenez lorsque vous utilisez le générateur d'interface Xcode).

J'ai utilisé ce qui suit:

[self.loginButton 
     setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil] 
     forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];
4
CPD

Une autre cause possible est la suivante:

Si vous tentez de définir le titre du bouton dans la méthode (id)initWithNibName: ..., La propriété de ce bouton sera toujours nulle. Il n'a pas encore été attribué à l'UIButton.

Vous devez être sûr que vous définissez vos boutons dans une méthode telle que (void)viewWillLoad Ou (void)viewWillAppear, Mais vous ne voudrez probablement pas les définir aussi tard que (void)viewDidAppear.

3
Ramsey

Parfois, cela peut devenir vraiment compliqué. Le moyen le plus simple est de "actualiser" la vue des boutons!

//Do stuff to your button here.  For example:

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];
2
Mike Rapadas

@funroll a absolument raison. Ici vous pouvez voir ce dont vous aurez besoin Assurez-vous que la fonction ne fonctionne que sur le thread principal . Si vous ne voulez pas traiter avec les threads, vous pouvez faire comme ceci par exemple: créez NSUserDefaults et dans ViewDidLoad la condition de vérification a été activée dans une autre vue (dans une autre vue définie dans NSUserDefaults, informations nécessaires) et selon les conditions définies, titre requis votre UIButton, donc [votreButton setTitle: @ "Title" pourState: UIControlStateNormal];

1
daleijn

Cela continuait à me poser des problèmes, la seule solution étant d’ajouter une image et une étiquette en tant que sous-vues à l’outton. Ensuite, j'ai découvert que le principal problème était que j'utilisais un UIButton avec le titre: Attributed. Quand je l'ai changé en Plain, le réglage du titleLabel.text a fait l'affaire!

1
Mark

Assurez-vous que vous êtes sur le fil principal.

Sinon, le texte du bouton sera quand même sauvegardé. Ce sera là lorsque vous inspecterez l'objet dans le débogueur. Mais cela ne mettra pas réellement à jour la vue.

0
funroll