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)];
}