Сайт, на который ссылаются в комментариях к принятому ответу ... теперь «ПОДОЗРЕВАЕМ» на веб-хосте, а в кеше Google нет скриншота, содержащего ключевой шаг.
Итак, вот альтернативное решение, которое я нашел, что:
- работает отлично
- не требует подклассов
Для некоторых клавиш (Enter, Delete, Backspace и т.д.), Apple делает НЕ вызывать обычные методы controlTextDidEndEditing: etc. Вместо этого 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;
}
В моем случае, я хотел для переопределения клавиши backspace тоже - запуск приложения с помощью этого метода, я получил вывод, в котором говорилось, что селектор был «deleteBackward:», поэтому я добавил еще один if-statement, чтобы реагировать на это.
Привет, Спасибо, что я сделал это, но как отфильтровать ключ ввода, потому что, когда они фокусируются или размываются из текстового поля, действие также запускается. THanks – Chris
Чтобы получить уведомление, когда редактирование завершено (либо введите ключ, либо нажата клавиша табуляции), вызывается метод управления делегатом classTextDidEndEditing, там вы можете вызвать действие. Если вы хотите, чтобы действие было инициировано только для ввода ключа, вам нужно либо написать собственный форматировщик, либо настроить класс NSTextfield. – Raviprakash
Черты Гудда. Я только что узнал, что вы можете отправить это действие только для ввода, как описано здесь: http://mojomonkeycoding.com/2009/11/14/calling-an-action-when-hitting-return-in-an-nstextfield /. К счастью, нет необходимости в подклассе. – Chris