Objective c 仅指定字符范围的NSTextStorage addAttribute
我一直在使用UITextView上的TextKit和NSTextStorage对象,试图将某些单词动态格式化 以下方法位于UITextView的子类中,并在textDidChange事件上执行。这样做的原因是,它确实能够检测何时输入了单词the,并将其涂成红色,但是单词the之后的所有文本也都是红色的。目标是只有红色的 知道我做错了什么吗Objective c 仅指定字符范围的NSTextStorage addAttribute,objective-c,Objective C,我一直在使用UITextView上的TextKit和NSTextStorage对象,试图将某些单词动态格式化 以下方法位于UITextView的子类中,并在textDidChange事件上执行。这样做的原因是,它确实能够检测何时输入了单词the,并将其涂成红色,但是单词the之后的所有文本也都是红色的。目标是只有红色的 知道我做错了什么吗 - (void)highlight { NSRegularExpression *regex = [NSRegularExpression regul
- (void)highlight {
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\bthe\\b" options:0 error:nil];
NSArray *matches = [regex matchesInString:[self text] options:0 range:NSMakeRange(0, [self.text length])];
for (NSTextCheckingResult *match in matches) {
[self.textStorage beginEditing];
[self.textStorage addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:match.range];
[self.textStorage endEditing];
}
}
之所以会发生这种情况,是因为NSTextStorage实际上是一个NSMutableAttributedString子类,而NSMutableAttributedString的工作方式是:它将属性扩展到插入的文本
尝试将NSTextStorage子类化,以便实现四种方法,如NSTextStorage文档中所述。然后,在NSTextStorage子类中实现-fixAttributesInRange:。在您手动给出的示例中,您需要在此方法中管理文本属性,例如突出显示单词
提高效率的一个技巧是尽可能少地重新处理文本。一种方法是仅处理已更改的当前段落的文本:
NSRange paragraphRange=[self.string paragraphRangeForRange:self.editedRange]
其中self.editedRange将由您的超类正确填充为刚刚更改的文本的范围。match.range的值是否正确?是的,该范围已被确认为正确。尝试将文本视图的TypingAttribute设置为normal属性,无论文本的属性是否不带红色,把所有火柴都烧成红色后。