2013-11-02 22 views
1

我一直在使用TextKitNSTextStorage对象UITextView尝试获取某些字以动态格式化。NSTextStorage addAttribute仅适用于指定范围的字符

以下方法位于UITextView的子类中,并在textDidChange事件中执行。这样做的效果在于,它确实能够检测何时输入了“the”这个词,并且它确实将它变成红色,但是“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]; 
    } 
} 
+0

'match.range'的值是否正确? –

+0

是的,范围已被证实是正确的。 –

+0

尝试将所有匹配项设置为红色后,将文本视图的“typingAttributes”设置为“正常”属性(不管文本的属性是否为红色)。 –

回答

0

这是发生,因为NSTextStorage实际上是一个NSMutableAttributedString子类,NSMutableAttributedString作品是这样的:它延伸属性插入的文本。

尝试子类化NSTextStorage(如此,您需要实施四种方法,如NSTextStorage文档中所述)。然后,在您的NSTextStorage子类中实现-fixAttributesInRange:。您需要在此方法中管理文本属性(例如,在您提供的示例中突出显示单词“the”)。

提高效率的一个诀窍就是尽可能少地重新处理文本。这样做的一个方法是为当前段落只处理文本发生了变化:

NSRange paragaphRange = [self.string paragraphRangeForRange:self.editedRange];

self.editedRange会被你的超正确填充是刚刚更改文本的范围。