96 votes

Est-il possible de mettre à jour le titre/texte d'un UIButton de manière programmatique ?

J'ai un UIButton qui, lorsqu'on appuie dessus, fait apparaître une nouvelle vue où l'utilisateur peut modifier certains paramètres. Lorsque l'utilisateur quitte la vue, j'aimerais mettre à jour le titre/le texte de l'écran d'accueil. 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 il ne semble jamais changer le texte/titre original tel que spécifié dans l'IB.

2 votes

Êtes-vous sûr que le code affiché est appelé ? Avez-vous placé un BREAKPOINT pour le prouver ? Pouvez-vous afficher la signature de votre délégué ?

3 votes

Par ailleurs, je crois que vous pouvez faire référence à plusieurs états de contrôle à la fois : [ myButton setTitle:@ "myTitle" forState :( UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ... ) ] ; Notez l'utilisation de l'opérateur OR bitwise par opposition à l'opérateur OR logique (||). En général, lorsque vous avez affaire à des états de ce type, vous pouvez effectuer un OU entre eux avec l'opérateur |. Que quelqu'un me corrige si je me trompe lourdement :)

0 votes

J'aimerais qu'il y en ait un comme UIControlStateAll :D

113voto

Yotes Points 491

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

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

52voto

Ken Pespisa Points 14935

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 qu'outlet dans Interface Builder (faites un ctrl-glisser depuis le nouvel outlet 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 je rencontre lorsque je vois ces symptômes.


Edit : Bien que ce ne soit pas le cas ici, quelque chose comme cela peut également se produire si vous définissez un titre attribué au bouton, puis vous essayez de changer le titre et non le titre attribué.

4 votes

Bingo, c'était ça, merci. J'aimerais vraiment qu'Objective-C lance une NullPointerException dans des cas comme celui-ci, au lieu de prétendre silencieusement qu'il est possible d'envoyer un message à un objet nul. Cela me mord presque quotidiennement... ugh !

20 votes

ObjC ne prétend pas qu'il est possible d'envoyer un message à nil, parce qu'il es OK pour envoyer des messages à nil...

1 votes

Le problème ici n'est pas un pointeur nul. Le problème est que IB a créé une instance de UIButton qui n'est pas référencée correctement dans le code (via IBOutlet), de sorte qu'elle ne peut jamais être manipulée par programme.

13voto

Oscar Points 763

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 devais le signaler à toute personne qui le rencontrerait.

Si vous ne définissez pas de texte par défaut pour le bouton dans le XIB, aucun texte n'apparaîtra jamais si vous le définissez de manière programmatique. Et si vous définissez du texte dans le XIB, tout texte que vous attribuez ensuite au bouton par voie programmatique sera tronqué à la taille du texte par défaut.

Enfin, si vous affichez la vue avec votre bouton et que vous invoquez ensuite une autre vue (comme une feuille d'action), puis que vous la fermez, le texte que vous avez assigné au bouton de manière programmatique sera effacé et la légende du bouton reviendra à ce que vous avez défini dans le XIB.

1 votes

J'ai remarqué ces trois comportements et c'est certainement ennuyeux.

2 votes

J'ai eu le problème de la troncature (en changeant le texte en quelque chose de plus long par programme), donc j'ai mis des espaces supplémentaires à la fin du texte pour "réserver" cet espace pour quand je change le texte en un mot plus long. Cela a fonctionné pour moi.

2 votes

Il semble que la solution consiste à utiliser la méthode [_button setTitle : @"title" forState : UIControlStateNormal] ; au lieu d'accéder directement à la propriété _button.titleLabel.text. Restez-en à l'appel de la méthode et vous obtiendrez probablement ce que vous voulez.

12voto

Bhavesh Nai Points 1525
[myButton setTitle: @"Hello" forState: UIControlStateNormal];

12voto

Maudicus Points 4513

Même si le problème de Caffeine Coma a été résolu, j'aimerais proposer une autre cause potentielle pour laquelle le titre ne s'affiche pas sur un UIButton.

Si vous définissez une image pour l'UIButton à l'aide de la fonction

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

Il peut couvrir le titre. Je l'ai appris à mes dépens et j'imagine que certains d'entre vous finissent par lire cette page pour la même raison.

Utilisez plutôt cette méthode

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

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X