Изменение текста UILabel, но сохранение остальных атрибутов

У меня есть UILabel в моем ViewController, созданном с использованием раскадровки. Шрифт, размер и цвет текста ярлыка, его выравнивание - все это задано в раскадровке. Метка в раскадровке подключается к выходу в моем файле под названием p_patientNameLbl.

Теперь я пытаюсь изменить текст метки программно, например:

[self.p_patientNameLbl setText:@"Vasya"];

Я не мог видеть новый текст, пока не понял, что исходная метка в раскадровке была белой на черном фоне, но, видимо, после того, как я изменил текст ярлыка, как указано выше, все атрибуты шрифта были reset, и теперь это был черный текст на черном фоне, и поэтому его не видели. После того как я программно задал цвет:

[self.p_patientNameLbl setTextColor:[UIColor whiteColor]];

Я мог видеть новую метку, но все остальные атрибуты шрифта и выравнивание по-прежнему были неправильными.

Есть ли способ изменить только текст метки, не имея при этом программно установить все остальные атрибуты? Я бы предположил, что должен быть способ, так как я не хочу форматировать свой интерфейс в коде!

Ответы

Ответ 1

Это происходит потому, что вы говорите, что построитель интерфейса должен взять метку с заранее определенными атрибутами, установленными в ее тексте, и заменить этот атрибутный текст на простой текст. Вместо setText или setTextColor вы должны использовать setAttributedText и указать атрибуты, которые вы хотите передать в атрибутированную строку.

Вот пример того, как программно применять прикладную строку к вашей метке. Я не знаю лучшего способа, но используя это, вы можете вносить изменения в текст или текст, и пока вы устанавливаете другие атрибуты вместе с ними, все изменения будут применены правильно.

[myLabel setAttributedText:[self myLabelAttributes:@"Some awesome text!"]];

....................

- (NSMutableAttributedString *)myLabelAttributes:(NSString *)input
{
    NSMutableAttributedString *labelAttributes = [[NSMutableAttributedString alloc] initWithString:input];

    [labelAttributes addAttribute:NSStrokeWidthAttributeName value:[NSNumber numberWithFloat:-5.0] range:NSMakeRange(0, labelAttributes.length)];
    [labelAttributes addAttribute:NSStrokeColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, labelAttributes.length)];
    [labelAttributes addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, labelAttributes.length)];

    return labelAttributes;
}

Ответ 2

Это работает для меня:

- (void)setText:(NSString *)text withExistingAttributesInLabel:(UILabel *)label {

    // Check label has existing text
    if ([label.attributedText length]) {

        // Extract attributes
        NSDictionary *attributes = [(NSAttributedString *)label.attributedText attributesAtIndex:0 effectiveRange:NULL];

        // Set new text with extracted attributes
        label.attributedText = [[NSAttributedString alloc] initWithString:text attributes:attributes];

    }

}

...

[self setText:@"Some text" withExistingAttributesInLabel:self.aLabel];

Ответ 3

Реализация одной строки в Swift:

label.attributedText = NSAttributedString(string: "text", attributes: label.attributedText!.attributesAtIndex(0, effectiveRange: nil))

Ответ 4

0x7fffffff, спасибо за подсказку, которая сработала для меня. В iOS6 некоторые другие советы здесь не работают, например. извлечение атрибутов и их повторное использование.

В моем случае я потерял немало полезных атрибутов, включая шрифт, поэтому здесь мое решение:

- (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;
}

затем примените его к UILabel следующим образом:

[self.myLabel setAttributedText:[self CurrentSetLabelAttributes:[NSString stringWithFormat:@"%d", myClass.text] col:[UIColor redColor]  size:50.0f]];

Ответ 5

Я делал это много раз для нескольких приложений. Я всегда делаю свои ярлыки и текст в Storyboard, изменяя их размер шрифта, цветной дисплей, альфа-значение и т.д. В редакторе. Но потом, если мне нужно изменить текст, который я сделал несколько раз, все, что я делаю, это.

p_patientNameLbl.textColor = [UIColor redColor];
p_patientNameLbl.text = @"My Sample Text";

вот оно. все остальные свойства по умолчанию сохранены. Разве я не пропустил что-то в вашем вопросе?

Ответ 6

Вместо сохранения старых атрибутов и создания новой NSAttributedString с измененным текстом и сохраненными атрибутами, будет относительно простой способ:

NSMutableAttributedString *attStr = [label.attributedText mutableCopy];
NSMutableString *str = attStr.mutableString;
/* change str with new text */
label.attributedText = attStr;