I'm trying to dynamically update the title of an IBOutletCollection
of UIButton
s. I expect the title to be set to
It wasn't working, so I printed out the titleForState:
s and it looks like the title is not getting set properly. Am I using setTitle: forState:
correctly?
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *buttons;
...
- (void)updateUI // Calling this from IBAction
{
for(UIButton *button in self.buttons) {
[button setTitle:@"S" forState:UIControlStateSelected];
[button setTitle:@"D|S" forState:UIControlStateSelected|UIControlStateDisabled];
NSLog(@"%@ %@ %@ %@ %d %d",
[button titleForState:UIControlStateSelected],
[button titleForState:UIControlStateSelected],
[button titleForState:UIControlStateNormal],
[button titleForState:UIControlStateSelected|UIControlStateDisabled],
button.selected,
button.enabled);
}
}
Here's the console output:
2013-02-21 21:05:36.070 Buttons[37130:c07] D|S D|S 0 1
2013-02-21 21:05:36.072 Buttons[37130:c07] D|S D|S 0 1
2013-02-21 21:05:36.073 Buttons[37130:c07] D|S D|S 0 1
2013-02-21 21:05:36.073 Buttons[37130:c07] D|S D|S 0 1
2013-02-21 21:05:36.073 Buttons[37130:c07] D|S D|S 0 1
2013-02-21 21:05:36.074 Buttons[37130:c07] D|S D|S 0 1
2013-02-21 21:05:36.074 Buttons[37130:c07] D|S D|S 0 1
2013-02-21 21:05:36.074 Buttons[37130:c07] D|S D|S 0 1
2013-02-21 21:05:36.075 Buttons[37130:c07] D|S D|S 0 1
2013-02-21 21:05:36.075 Buttons[37130:c07] D|S D|S 0 1
2013-02-21 21:05:36.076 Buttons[37130:c07] D|S D|S 0 1
2013-02-21 21:05:36.076 Buttons[37130:c07] D|S D|S 0 1
It's not working because IB sets attributedTitle
instead of title
.
Try this instead:
NSAttributedString *attributedTitle = [self.myButton attributedTitleForState:UIControlStateNormal];
NSMutableAttributedString *mas = [[NSMutableAttributedString alloc] initWithAttributedString:attributedTitle];
[mas.mutableString setString:@"New Text"];
[self.myButton setAttributedTitle:mas forState:UIControlStateNormal];
Or, alternatively:
[self.myButton setAttributedTitle:nil forState:UIControlStateNormal];
[self.myButton setTitle:@"New Text" forState:UIControlStateNormal];
(The second option won't preserve your formatting.)
After trying a lot of different things, the only way I got it working is as below. But this is a C-style logic and changes the meaning of selected and disabled UIButton control state. Definitely a hack :(
// [cardButton setTitle:card.contents
// forState:UIControlStateSelected|UIControlStateDisabled];
if(cardButton.selected && !cardButton.enabled) {
[cardButton setTitle:card.contents forState:UIControlStateNormal];
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With