1

我一直在努力TextKit尝试NSTextStorageUITextView某些单词动态格式化。

以下方法在事件的子类中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];
    }
}
4

1 回答 1

0

发生这种情况是因为NSTextStorage它实际上是一个NSMutableAttributedString子类,并且NSMutableAttributedString以这种方式工作:它将属性扩展到插入的文本。

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

提高效率的一个技巧是重新处理尽可能少的文本。这样做的一种方法是仅处理已更改的当前段落的文本:

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

self.editedRange您的超类将在哪里正确填充刚刚更改的文本范围。

于 2016-03-30T21:25:32.357 回答