Ответ Роба Кенигера хорошо, но для кого-то, ищущего более конкретный пример, вот короткая подсветка синтаксиса, которую я написал, которая должна выделить синтаксис шаблона RegEx. Я хочу, чтобы \
был серым, а персонаж, следующий за ними, должен быть черным. Я хочу, чтобы $
был красным, а цифра сразу после $
также была красной. Все остальное должно быть черным. Вот мое решение:
Я создал класс подсветки шаблона с заголовком, который выглядит следующим образом:
@interface RMETemplateHighlighter : NSObject <NSTextStorageDelegate>
@end
Я инициализирую его в nib-файле как объект и подключаю к контроллеру представления через розетку. В awakeFromNib
контроллера представления у меня есть это (где replacer
- моя NSTextView
розетка и templateHighlighter
- розетка для класса выше):
self.replacer.textStorage.delegate = self.templateHighlighter;
И моя реализация выглядит так:
- (void)textStorageDidProcessEditing:(NSNotification *)notification {
NSTextStorage *textStorage = notification.object;
NSString *string = textStorage.string;
NSUInteger n = string.length;
[textStorage removeAttribute:NSForegroundColorAttributeName range:NSMakeRange(0, n)];
for (NSUInteger i = 0; i < n; i++) {
unichar c = [string characterAtIndex:i];
if (c == '\\') {
[textStorage addAttribute:NSForegroundColorAttributeName value:[NSColor lightGrayColor] range:NSMakeRange(i, 1)];
i++;
} else if (c == '$') {
NSUInteger l = ((i < n - 1) && isdigit([string characterAtIndex:i+1])) ? 2 : 1;
[textStorage addAttribute:NSForegroundColorAttributeName value:[NSColor redColor] range:NSMakeRange(i, l)];
i++;
}
}
}
Итак, вы работаете, полностью рабочий пример. Было несколько деталей, из-за которых меня отключили на ~ 10 минут, например, тот факт, что вам нужно вынуть строку из textStorage для доступа к отдельным персонажам ... возможно, это сэкономит другим людям несколько минут.