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

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

14.08.2008 16:32:22
4 ОТВЕТА
РЕШЕНИЕ

В общем случае, способ, которым вы реализуете это, просто добавляет требуемую функцию в контроллер вашего представления и устанавливает его делегат. Например, если вы хотите, чтобы код выполнялся при загрузке представления, вы просто делегируете свое представление контроллеру и реализует функцию awakeFromNib.

Итак, чтобы обнаружить нажатие клавиши в текстовом представлении, убедитесь, что ваш контроллер является делегатом текстового представления, а затем реализуйте это:

- (void)keyUp:(NSEvent *)theEvent

Обратите внимание, что это унаследованный метод NSResponder, а не метод NSTextView.

14
14.08.2008 16:43:05
keyUp не вызывается, если вы поместите его в делегат. Вы должны создать подкласс NSTextView и поместить его туда.
Bob Murphy 20.03.2014 23:15:18

Важно сообщить нам, чего вы на самом деле пытаетесь достичь - цель более высокого уровня, которая, по вашему мнению, будет охватывать ключевые события в NSTextView.

Например, когда кто-то спрашивает меня, как записать ключевые события в поле NSText, они действительно хотят знать, как проверить ввод в поле. Это делается путем установки модуля форматирования поля для экземпляра NSFormatter (будь то один из форматеров, включенных в Какао или пользовательский), а не путем непосредственной обработки нажатий клавиш.

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

2
15.08.2008 05:41:51

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

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

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

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

1
15.08.2008 23:12:13

Просто совет для подсветки синтаксиса:

Не выделяйте весь текстовый вид сразу - он очень медленный. Также не выделяйте последний отредактированный текст с помощью -editedRange - он тоже очень медленный, если пользователь вставляет большой объем текста в текстовое представление.

Вместо этого вам нужно выделить видимый текст, который делается так:

NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect];
NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];

Затем вы подаете visibleRange в ваш код подсветки.

10
16.08.2008 10:35:10