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