Сайт, на который ссылаются в комментариях к принятому ответу ... теперь "приостановлен" веб-хостом, и в кеше Google нет скриншота, содержащего ключевой шаг.
Итак, вот альтернативное решение, которое я нашел, что:
- отлично работает
- НЕ требует подклассов
Для некоторых клавиш (Enter, Delete, Backspace и т. Д.) Apple НЕ вызывает обычные методы controlTextDidEndEditing: и т. Д. Вместо этого Apple делает отдельные селекторы для каждого магического ключа - но есть метод, который вы можете использовать для его перехвата.
Официальные документы Apple здесь:
https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/TextEditing/TextEditing.html#//apple_ref/doc/uid/TP40009459-CH3-SW31
... но в случае, если он исчезает / перемещается, добавьте этот метод в ваш делегат:
- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
{
BOOL retval = NO;
if (commandSelector == @selector(insertNewline:)) {
retval = YES; // causes Apple to NOT fire the default enter action
// Do your special handling of the "enter" key here
}
NSLog(@"Selector = %@", NSStringFromSelector( commandSelector ) );
return retval;
}
В моем случае я тоже хотел переопределить клавишу возврата - запустив приложение этим методом, я получил вывод о том, что селектор был «deleteBackward:», поэтому я добавил еще один оператор if, чтобы среагировать на это.