Захват клавиш «вверх» и «вниз», нажатых в NSTextField - PullRequest
11 голосов
/ 11 июля 2011

Я пишу приложение «Агент» Какао, где у меня есть TextField в меню иконки состояния, это выглядит так:

http://s3.ifotos.pl/img/Zrzut-ekr_hwaqnwa.png

Когда вы используете степпер, значение увеличивается / уменьшается на 5. Я хочу, чтобы при фокусировке текстового поля и нажатии клавиш «вверх» или «вниз» происходило то же самое - значение увеличивается или уменьшается на 5.

Я уже понял, что должен использовать - (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector из NSControlTextEditingDelegate протокола.

Но я действительно растерялся, как я это делаю. Обычно я просто делаю sth.delegate = self;, а здесь я просто не знаю. Недружественный язык документации Apple и мой плохой английский мне не помогают. Я пытался найти ответ, но все люди просто указали на control:textView:..., и мои возможности поиска в Google потерпели неудачу, когда я захотел выяснить, как я использую этот метод делегата.

Спасибо заранее . Пожалуйста, не бей меня;)

Ответы [ 3 ]

19 голосов
/ 12 июля 2011

Вам необходимо создать объект, который будет служить делегатом текстового поля. Это можно сделать либо в коде, либо, если это кажется целесообразным, в Интерфейсном Разработчике. Возможно, у вас уже есть контроллер, отвечающий за это поле, и шаговый контроллер, так что это хороший кандидат. Этот объект делегата - это то, что нужно для реализации упомянутого вами метода:

- (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, который обрабатывает ввод от имени текстового поля, когда поле активно.

2 голосов
/ 11 июля 2011

Попробуйте переопределить сообщение NSResponder, например:

- (BOOL)performKeyEquivalent:(NSEvent *)theEvent{
    switch ([[theEvent charactersIgnoringModifiers] characterAtIndex:0]) {
        case NSUpArrowFunctionKey:
            // Increase by 5 here
            return YES;
            break;
        case NSDownArrowFunctionKey:;
            // Decrease by 5 here
            return YES;
            break;
        default:
            break;
    }
    return [super performKeyEquivalent:theEvent];
}
1 голос
/ 05 августа 2016

Если вы хотите захватить ярлыки, вы также можете использовать такой код:

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {

NSEvent *currentEvent = [[NSApplication sharedApplication]currentEvent];
if ((currentEvent.modifierFlags & NSCommandKeyMask) && (currentEvent.keyCode == kVK_Return)) {  //command + enter to confirm
    //do what you want
    return YES;
}
return NO;
}
...