Измените текст атрибута UILabel без потери форматирования?
В раскадровке я компоную набор меток с различными вариантами форматирования.
Тогда я делаю:
label.text = @"Set programmatically";
И все форматирование теряется! Это отлично работает в iOS5.
Должен быть способ просто обновить текстовую строку без перекодирования всего форматирования?!
label.attributedText.string
доступен только для чтения.
Спасибо заранее.
Ответы
Ответ 1
Приписанная строка содержит все данные форматирования. Метка вообще ничего не знает о форматах.
Вы могли бы сохранить атрибуты в виде отдельного словаря, а затем, когда вы измените атрибут string, вы можете использовать:
[[NSAttributedString alloc] initWithString:@"" attributes:attributes range:range];
Единственный другой вариант - снова создать атрибуты.
Ответ 2
Вы можете извлечь атрибуты в качестве словаря с помощью:
NSDictionary *attributes = [(NSAttributedString *)label.attributedText attributesAtIndex:0 effectiveRange:NULL];
Затем добавьте их обратно с новым текстом:
label.attributedText = [[NSAttributedString alloc] initWithString:@"Some text" attributes:attributes];
Это предполагает, что в нем есть текст, иначе вы потерпите крах, поэтому вам, вероятно, следует сначала выполнить проверку:
if ([self.label.attributedText length]) {...}
Ответ 3
Хотя я новичок в программировании на iOS, я очень быстро столкнулся с одной и той же проблемой. В iOS, мой опыт заключается в том, что
- Проблема Lewis42 возникает последовательно
- Предложение josef об извлечении и повторном применении атрибутов
не работает: возвращается словарь с нулевыми атрибутами.
Оглядевшись вокруг s/o, я наткнулся на This Post и последовал этой рекомендации, я в конечном итоге использовал это:
- (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;