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

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

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

NSMutableAttributedString *coloredText = [[NSMutableAttributedString alloc] initWithString:@"This is a test"]; [coloredText addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(10,4)]; 

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

Если я сделаю:

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

Я получаю ошибку objectAtIndex: effectiveRange: out of bounds. Предположительно, потому что диапазон простирается за пределы длины строки.

Если я сделаю:

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

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

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

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

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

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

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

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

  • заменить всю текстовую строку в NSAttributedString без изменения других атрибутов
  • Анимация NSTextAttachment
  • Верхний выравнивающий текст разных размеров в пределах UILabel
  • iOS NSAttributedString для HTML
  • Неверный размер UILabel для отдельной строки текста с использованием LineSpacing и нескольких цветов
  • Использование Range <Index> с NSRange в API NSAttributedString
  • Как удалить дополнение в последнем абзаце из NSAttributedString, созданного из HTML, используя NSHTMLTextDocumentType
  • iOS7 UITextView устанавливает атрибут NSLinkAttributeName, но не может щелкнуть
  • Ошибка приложения iOS 5.1 при запуске с Symbol не найден: _NSFontAttributeName
  • UITextView с атрибутом текста в iOS 6.1 с базовым SDK iOS 6.1 не работает
  • Почему UITextView объединяет атрибуты из ранее заданного атрибутаText?
  • Давайте будем гением компьютера.