Вам необходимо создать объект, который будет служить делегатом текстового поля. Это можно сделать либо в коде, либо, если это кажется целесообразным, в Интерфейсном Разработчике. Возможно, у вас уже есть контроллер, отвечающий за это поле, и шаговый контроллер, так что это хороший кандидат. Этот объект делегата - это то, что нужно для реализации упомянутого вами метода:
- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
Этот метод вызывается всякий раз, когда редактору поля * для текстового поля предлагается выполнить одно из NSResponder
сообщений действия . Редактор поля спрашивает своего делегата, который является текстовым полем, что он должен делать, а поле в свою очередь спрашивает своего делегата, который является вашим объектом.
Аргумент commandSelector
содержит имя сообщения действия. Поэтому вы можете проверить интересующие вас сообщения (в данном случае moveUp:
и moveDown:
) и перехватить их. Вы выполняете любые действия, которые вам нравятся, и не позволяете редактору полей или текстовому полю воздействовать на сообщение.
- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor
doCommandBySelector:(SEL)commandSelector {
if( commandSelector == @selector(moveUp:) ){
// Your increment code
return YES; // We handled this command; don't pass it on
}
if( commandSelector == @selector(moveDown:) ){
// Your decrement code
return YES;
}
return NO; // Default handling of the command
}
* Вкратце, NSTextView
, который обрабатывает ввод от имени текстового поля, когда поле активно.