Лучший способ захватить ключевые события в NSTextView? - PullRequest
15 голосов
/ 14 августа 2008

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

Ответы [ 4 ]

14 голосов
/ 14 августа 2008

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

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

- (void)keyUp:(NSEvent *)theEvent

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

10 голосов
/ 16 августа 2008

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

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

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

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

Затем вы передаете visibleRange в код выделения.

2 голосов
/ 15 августа 2008

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

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

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

1 голос
/ 16 августа 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...