Выполнить действие при нажатии клавиши Enter в NSTextField? - PullRequest
61 голосов
/ 15 июня 2009

У меня сейчас небольшая проблема. Я хочу выполнить метод, когда клавиша Enter нажата в NSTextField. Пользователь должен иметь возможность вводить свои данные, и метод расчета должен выполняться, как только он нажимает клавишу ввода.

Ответы [ 8 ]

78 голосов
/ 15 июня 2009

Вы можете сделать это, установив действие текстового поля. В IB подключите селектор текстового поля к контроллеру или любому другому объекту, представляющему IBAction, который вы хотите использовать.

Чтобы установить его в коде, отправьте NSTextField сообщение setTarget: и сообщение setAction:. Например, если вы устанавливаете это на объекте контроллера в коде, и ваш выход textField называется myTextField:

- (void)someAction:(id)sender
{
  // do something interesting when the user hits <enter> in the text field
}

// ...

[myTextField setTarget:self];
[myTextField setAction:@selector(someAction:)];
44 голосов
/ 04 декабря 2013

Вы должны сделать только это

Для некоторых клавиш (Enter, Delete, Backspace и т. Д.)

self.textfield.delegate = self;

и затем реализовать этот метод

- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
{
    NSLog(@"Selector method is (%@)", NSStringFromSelector( commandSelector ) );
    if (commandSelector == @selector(insertNewline:)) {
        //Do something against ENTER key

    } else if (commandSelector == @selector(deleteForward:)) {
        //Do something against DELETE key

    } else if (commandSelector == @selector(deleteBackward:)) {
        //Do something against BACKSPACE key

    } else if (commandSelector == @selector(insertTab:)) {
        //Do something against TAB key
    }

    // return YES if the action was handled; otherwise NO
} 
24 голосов
/ 27 июня 2012

В вашем делегате (NSTextFieldDelegate) добавьте следующее:

-(void)controlTextDidEndEditing:(NSNotification *)notification
{
    // See if it was due to a return
    if ( [[[notification userInfo] objectForKey:@"NSTextMovement"] intValue] == NSReturnTextMovement )
    {
        NSLog(@"Return was pressed!");
    }
}
10 голосов
/ 12 февраля 2017

Версия решения @ M.ShuaibImran Swift 3 :

Первый подкласс вашего ViewController для: NSTextFieldDelegate

class MainViewController: NSViewController, NSTextFieldDelegate {
  ...
} 

Назначьте делегат textField ViewController в вашем viewDidLoad ():

self.textField.delegate = self

Включите метод NSTextFieldDelegate, который обрабатывает ответчики клавиатуры:

func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
    if (commandSelector == #selector(NSResponder.insertNewline(_:))) {
        // Do something against ENTER key
        print("enter")
        return true
    } else if (commandSelector == #selector(NSResponder.deleteForward(_:))) {
        // Do something against DELETE key
        return true
    } else if (commandSelector == #selector(NSResponder.deleteBackward(_:))) {
        // Do something against BACKSPACE key
        return true
    } else if (commandSelector == #selector(NSResponder.insertTab(_:))) {
        // Do something against TAB key
        return true
    } else if (commandSelector == #selector(NSResponder.cancelOperation(_:))) {
        // Do something against ESCAPE key
        return true
    }

    // return true if the action was handled; otherwise false
    return false
}
8 голосов
/ 05 февраля 2016

Это очень просто, и вы можете сделать это прямо из редактора пользовательского интерфейса

  1. Щелкните правой кнопкой мыши текстовое поле и перетащите ссылку «Действие» на кнопку, как показано ниже на скриншоте

enter image description here

  1. Теперь это даст вам некоторую опцию, как показано на снимке экрана ниже, вам нужно выбрать «выполнить щелчок»

enter image description here

  1. Теперь это должно выглядеть так

enter image description here

Примечание: Событие будет вызвано, как только вы нажмете клавишу Tab или Enter. Если вы хотите, чтобы действие выполнялось только тогда, когда пользователь нажимает клавишу Enter, вам необходимо выполнить настройку. Перейдите к Attribute inspector и измените свойство Action на Send on Enter only, как показано на снимке экрана ниже

enter image description here

4 голосов
/ 28 ноября 2011

NSTextFieldDelegate - control:textView:doCommandBySelector: ваш друг.

Найдите команду insertNewline:.

1 голос
/ 09 апреля 2014

Лучший способ сделать это - связать значение NSTextField со свойством NSString.

Например, определите метод:

(void)setTextFieldString:(NSString *)addressString {}

добавить привязки:

[textField bind:@"value" toObject:self withKeyPath:@"self.textFieldString" options:nil];

Введите любой текст и нажмите клавишу возврата, будет вызван setTextFieldString.

1 голос
/ 07 января 2010

В Интерфейсном Разработчике - нажмите на свой NSTextField, перейдите в редактор соединений, перетащите из селектора на объект вашего контроллера - ваши действия должны прийти!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...