Objective c 仅指定字符范围的NSTextStorage addAttribute

Objective c 仅指定字符范围的NSTextStorage addAttribute,objective-c,Objective C,我一直在使用UITextView上的TextKit和NSTextStorage对象,试图将某些单词动态格式化 以下方法位于UITextView的子类中,并在textDidChange事件上执行。这样做的原因是,它确实能够检测何时输入了单词the,并将其涂成红色,但是单词the之后的所有文本也都是红色的。目标是只有红色的 知道我做错了什么吗 - (void)highlight { NSRegularExpression *regex = [NSRegularExpression regul

我一直在使用UITextView上的TextKit和NSTextStorage对象,试图将某些单词动态格式化

以下方法位于UITextView的子类中,并在textDidChange事件上执行。这样做的原因是,它确实能够检测何时输入了单词the,并将其涂成红色,但是单词the之后的所有文本也都是红色的。目标是只有红色的

知道我做错了什么吗

- (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属性,无论文本的属性是否不带红色,把所有火柴都烧成红色后。