Reputation: 3202
In the storyboard I layout a set of labels with various formatting options.
Then I do:
label.text = @"Set programmatically";
And all formatting is lost! This works fine in iOS5.
There must be a way of just updating the text string without recoding all the formatting?!
label.attributedText.string
is read only.
Thanks in advance.
Upvotes: 21
Views: 20833
Reputation: 77661
An attributedString contains all of its formatting data. The label doesn't know anything about the formats at all.
You could possibly store the attributes as a separate dictionary and then when you change the attributedString you can use:
[[NSAttributedString alloc] initWithString:@"" attributes:attributes range:range];
The only other option is to build the attributes back up again.
Upvotes: 4
Reputation: 1025
You can extract the attributes as a dictionary with:
NSDictionary *attributes = [(NSAttributedString *)label.attributedText attributesAtIndex:0 effectiveRange:NULL];
Then add them back with the new text:
label.attributedText = [[NSAttributedString alloc] initWithString:@"Some text" attributes:attributes];
This assumes the label has text in it, otherwise you'll crash so you should probably perform a check on that first with:
if ([self.label.attributedText length]) {...}
Upvotes: 29
Reputation: 59
Although new to iOS programming, I encountered the same problem very quickly. In iOS, my experience is that
Having looked around s/o, I came across This Post and followed that recommendation, I ended up using this:
- (NSMutableAttributedString *)SetLabelAttributes:(NSString *)input col:(UIColor *)col size:(Size)size {
NSMutableAttributedString *labelAttributes = [[NSMutableAttributedString alloc] initWithString:input];
UIFont *font=[UIFont fontWithName:@"Helvetica Neue" size:size];
NSMutableParagraphStyle* style = [NSMutableParagraphStyle new];
style.alignment = NSTextAlignmentCenter;
[labelAttributes addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, labelAttributes.length)];
[labelAttributes addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, labelAttributes.length)];
[labelAttributes addAttribute:NSForegroundColorAttributeName value:col range:NSMakeRange(0, labelAttributes.length)];
return labelAttributes;
Upvotes: 4