Лучший способ фиксировать ключевые события в NSTextView?

Я медленно изучаю Objective-C и Какао, и пока что единственный способ фиксировать ключевые события в текстовых представлениях - это использовать делегирование, но у меня возникают проблемы с поиском полезной документации и примеров того, как реализовать такое решение. Может ли кто-нибудь указать мне правильное направление или оказать помощь из первых рук?

Ответов (4)

Решение

Как правило, вы реализуете это просто, добавляя требуемую функцию к контроллеру вашего представления и устанавливая ее делегата. Например, если вы хотите, чтобы код запускался при загрузке представления, вы просто делегируете свое представление контроллеру и реализуете функцию 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 (будь то одно из средств форматирования, включенных в Какао или пользовательское), а не путем непосредственной обработки нажатий клавиш.

Итак, учитывая этот пример, чего вы на самом деле пытаетесь достичь?

Я немного покопался и нашел ответ на свой вопрос. Я расскажу об этом ниже, но спасибо двум ребятам, которые ответили. Я думаю, что Stack Overflow уже является фантастическим сайтом - я надеюсь, что больше разработчиков Mac найдут свой путь после завершения бета-тестирования - это может быть отличным ресурсом для других разработчиков, желающих перейти на платформу.

Итак, я, как предложил Дэнни, нашел свой ответ в делегации. Чего я не понял из сообщения Дэнни, так это того, что в объекте делегирования есть набор методов с поддержкой делегата и что делегат должен реализовывать указанные события. Итак, для TextView я смог найти метод textDidChange, который выполнил то, что я хотел, даже лучше, чем просто захват нажатия клавиш. Итак, если я реализую это в своем контроллере:

- (void)textDidChange:(NSNotification *)aNotification;

Могу ответить на редактируемый текст. Есть, конечно, и другие методы, и мне не терпится поиграть с ними, потому что я знаю, что многому научусь, как и я. Еще раз спасибо, ребята.