NSTextView: Когда нужно автоматически вставлять символы (например, автоматически сопоставлять скобки)?

У меня есть NSTextView и я действую как его NSTextStorage делегат, поэтому я получаю обратные вызовы для textStorageWillProcessEditing: а также textStorageDidProcessEditing:и в настоящее время я использую did обратный вызов для изменения некоторых атрибутов в тексте (раскраска определенных слов).

Что я хотел бы сделать, это добавить автоматическое сопоставление определенных пар символов. Когда пользователь вводит (Я хочу вставить ) тоже, но я не совсем уверен, когда и где подходящее время, чтобы сделать это.

Из протокола делегата хранения текста, он говорит will Метод позволяет изменить текст для отображения.. но я не совсем уверен, что это значит или как я могу это сделать. Текстовая система действительно большая и запутанная.

Как мне это сделать?

1 ответ

В моем проекте с открытым исходным кодом я подкласс 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)];
}
Другие вопросы по тегам