NSAttributedString在string末尾改变颜色

这一定是一件容易的事,但我无法弄清楚。

我有一个NSMutableAttributedString,例如,“这是一个testing”。 我想给“testing”一词涂上蓝色,我这样做:

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

这工作得很好。 但是现在我想把文本颜色设置为黑色,以便在“testing”之后input任何东西。

如果我做:

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

我得到一个objectAtIndex:effectiveRange:越界的错误。 假定范围超出了string的长度。

如果我做:

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

错误消失,但在“testing”之后键入仍然是蓝色的。

如何在插入点处设置当前颜色?

欢呼任何input。

如果文本发生更改,则需要重新计算属性,因为其有效范围不会随文本长度而自动更改。

如果有人绊倒在这,我想张贴我用来解决问题的代码。 我结束了使用卡米尔的build议,并补充说:

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

到文本更改处理程序。