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

StackOverflow https://stackoverflow.com/questions/11291

  •  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;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top