NSTextView:何时自动插入字符(如自动匹配括号)?

时间:2012-06-04 15:18:25

标签: macos cocoa nstextview nstextstorage

我有一个NSTextView而我正在扮演NSTextStorage代表的角色,所以我收到了textStorageWillProcessEditing:textStorageDidProcessEditing:的回调,而且我现在正在回复使用did回调来更改文本上的某些属性(着色某些单词)。

我想要做的是添加某些字符对的自动匹配。当用户键入(时,我也要插入),但我不确定何时或何地适当地执行此操作。

从文本存储委托协议,它说will方法允许您更改要显示的文本..但我不确定这意味着什么或如何做到这一点。文本系统非常庞大且令人困惑。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

在我的开源项目中,我将NSTextView子类化并覆盖insertText:来处理匹配字符的插入。您可以检查insertText:的参数以查看它是否是您想要操作的内容,调用super来执行正常的文本插入,然后在需要时使用适当的匹配字符串再次调用insertText:

这样的事情:

- (void)insertText:(id)insertString {
    [super insertText:insertString];

    // if the insert string isn't one character in length, it cannot be a brace character
    if ([insertString length] != 1)
        return;

    unichar firstCharacter = [insertString characterAtIndex:0];

    switch (firstCharacter) {
        case '(':
            [super insertString:@")"];
            break;
        case '[':
            [super insertString:@"]"];
            break;
        case '{':
            [super insertString:@"}"];
            break;
        default:
            return;
    }

    // adjust the selected range since we inserted an extra character
    [self setSelectedRange:NSMakeRange(self.selectedRange.location - 1, 0)];
}