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.
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é.
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];
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.
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
À partir de Swift 4:
button.setTitle("Click", for: .normal)
pour Swift:
button.setTitle("Swift", forState: UIControlState.Normal)
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];
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
.
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];
@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];
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!
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.