Лучший способ зафиксировать ключевые события в NSTextView?
-
08-06-2019 - |
Вопрос
Я медленно осваиваю Objective-C и Cocoa, и пока что единственный способ, который я вижу для фиксации ключевых событий в текстовых представлениях, - это использовать делегирование, но у меня возникли проблемы с поиском полезной документации и примеров о том, как реализовать такое решение.Кто-нибудь может указать мне правильное направление или оказать помощь из первых рук?
Решение
Как правило, способ, которым вы это реализуете, заключается в простом добавлении требуемой функции в контроллер вашего представления и установке ее делегата.Например, если вы хотите, чтобы код запускался при загрузке представления, вы просто делегируете свое представление контроллеру и реализуете функцию awakeFromNib.
Итак, чтобы обнаружить нажатие клавиши в текстовом представлении, убедитесь, что ваш контроллер является делегатом текстового представления, а затем реализуйте это:
- (void)keyUp:(NSEvent *)theEvent
Обратите внимание, что это унаследованный метод NSResponder, а не метод NSTextView.
Другие советы
Просто совет по подсветке синтаксиса:
Не выделяйте весь текстовый вид сразу - это очень медленно.Также не выделяйте последний отредактированный текст с помощью -editedRange - это тоже очень медленно, если пользователь вставляет большой объем текста в текстовое представление.
Вместо этого вам нужно выделить видимый текст, который делается следующим образом:
NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect];
NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];
Затем вы добавляете visibleRange в свой код подсветки.
Важно рассказать нам, чего вы на самом деле пытаетесь достичь — цели более высокого уровня, которую, по вашему мнению, будет решать захват ключевых событий в NSTextView.
Например, когда кто-то спрашивает меня, как зафиксировать ключевые события в NSTextПоле что они действительно хотят знать, так это как проверять входные данные в поле.Это делается путем установки средства форматирования поля в экземпляр NSFormatter (будь то один из средств форматирования, включенных в Cocoa, или пользовательский), а не путем обработки нажатий клавиш напрямую.
Итак, учитывая этот пример, чего вы на самом деле пытаетесь достичь?
Я провел кое-какие тщательные раскопки и действительно нашел ответ на свой собственный вопрос.Я расскажу об этом ниже, но спасибо двум парням, которые ответили.Я думаю, что Stack Overflow уже является фантастическим сайтом - я надеюсь, что больше разработчиков Mac найдут свой путь к нему после завершения бета-тестирования - это может стать отличным ресурсом для других разработчиков, желающих перейти на платформу.
Итак, я, как и предложил Дэнни, нашел свой ответ в делегировании полномочий.Чего я не понял из поста Дэнни, так это того, что в делегирующем объекте есть набор методов с поддержкой делегирования и что делегат должен реализовать указанные события.Итак, для TextView я смог найти метод textDidChange, который выполнил то, что я хотел, даже лучшим способом, чем просто захват нажатий клавиш.Итак, если я реализую это в своем контроллере:
- (void)textDidChange:(NSNotification *)aNotification;
Я могу ответить на редактируемый текст.Конечно, есть и другие доступные методы, и мне не терпится поиграть с ними, потому что я знаю, что по ходу дела многому научусь.Еще раз спасибо, ребята.