NSAttributedString меняет цвет в конце строки

Это должно быть легко сделать, но я не могу понять это.

У меня есть NSMutableAttributedString, в котором есть, например, «Это тест». Я хочу покрасить слово «тест» в синий цвет, что я и делаю:

NSMutableAttributedString *coloredText = [[NSMutableAttributedString alloc] initWithString:@"This is a test"];

[coloredText addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(10,4)];

Это прекрасно работает. Но теперь я хочу вернуть цвет текста к черному цвету для всего, что напечатано после «теста».

If I do:

[coloredText addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(coloredText.string.length, 1)];

Я получаю ошибку objectAtIndex: EffectiveRange: вне границ. Предположительно, потому что диапазон выходит за пределы длины строки.

If I do:

[coloredText addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(coloredText.string.length, 0)];

Ошибка исчезает, но текст после слова «тест» остается синим.

Как установить текущий цвет в точке вставки, когда он находится в конце строки??

Приветствия для любого ввода.


person Raconteur    schedule 01.10.2013    source источник
comment
Вы не можете ввести NSAttributedString. Если вы используете UITextField или UITextView, вам следует правильно обновить свой вопрос.   -  person rmaddy    schedule 01.10.2013
comment
Спасибо за комментарий, но это кажется немного щепетильным, учитывая, что, как вы сказали, вы не можете вводить в NSAttributedString и что элемент управления, представляющий строку, не имеет отношения к заданному вопросу.   -  person Raconteur    schedule 01.10.2013


Ответы (2)


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

person kkodev    schedule 01.10.2013

На случай, если кто-то еще наткнется на это, я хотел опубликовать код, который использовал для решения проблемы. В итоге я воспользовался предложением Камиля и добавил:

NSAttributedString *selectedString = [textView.attributedText attributedSubstringFromRange:NSMakeRange(textView.attributedText.string.length - 1, 1)];
    __block BOOL isBlue = NO;

    [selectedString enumerateAttributesInRange:NSMakeRange(0, [selectedString length]) options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(NSDictionary *attributes, NSRange range, BOOL *stop) {
        isBlue = [[attributes objectForKey:NSForegroundColorAttributeName] isEqual:[UIColor blueColor]];
    }];

    if (isBlue) {
        NSMutableAttributedString *coloredText = [[NSMutableAttributedString alloc] initWithAttributedString:textView.attributedText];
        [coloredText addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(textView.attributedText.string.length - 1, 1)];
        textView.attributedText = coloredText;
    }

к обработчику изменения текста.

person Raconteur    schedule 01.10.2013