У меня сейчас небольшая проблема. Я хочу выполнить метод, когда клавиша Enter нажата в NSTextField. Пользователь должен иметь возможность вводить свои данные, и метод расчета должен быть выполнен, как только он нажимает клавишу ввода.
Выполнить действие, когда клавиша Enter нажата в NSTextField?
Ответ 1
Вы можете сделать это, установив действие текстового поля. В IB проведите селектор текстового поля к вашему контроллеру или какой-либо объект представляет IBAction, который вы хотите использовать.
Чтобы установить его в код, отправьте сообщение NSTextField a 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:)];
Ответ 2
Вы должны сделать только это
Для некоторых клавиш (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
}
Ответ 3
В вашем делегате (NSTextFieldDelegate) добавьте следующее:
-(void)controlTextDidEndEditing:(NSNotification *)notification
{
// See if it was due to a return
if ( [[[notification userInfo] objectForKey:@"NSTextMovement"] intValue] == NSReturnTextMovement )
{
NSLog(@"Return was pressed!");
}
}
Ответ 4
NSTextFieldDelegate - control:textView:doCommandBySelector: является вашим другом.
Найдите команду insertNewline:.
Ответ 5
Это очень просто, и вы можете сделать это непосредственно из редактора пользовательского интерфейса
- Щелкните правой кнопкой мыши на Text Feild, перетащите ссылку Action на кнопку, как показано ниже на скриншоте
- Теперь он предоставит вам некоторую опцию, как показано на снимке экрана ниже, вам нужно выбрать выполнить щелчок
- Теперь это должно выглядеть так.
Примечание. Событие будет поднято, как только вы нажмете клавишу Tab или Enter. Если вы хотите, чтобы действие было поднято только тогда, когда пользователь нажимает клавишу Enter, вам необходимо выполнить настройку. Перейдите в Attribute inspector и измените свойство Action на Send on Enter only, как показано на снимке экрана ниже
Ответ 6
Версия Swift 3 решения @M.ShuaibImran:
Первый подкласс вашего ViewController к: NSTextFieldDelegate
class MainViewController: NSViewController, NSTextFieldDelegate {
...
}
Назначьте делегат textField для ViewController в вашем представленииDidLoad():
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
}
Ответ 7
В интерфейсе Builder - нажмите на свой NSTextField, перейдите в редактор соединений, перетащите его из селектора в объект контроллера - вы должны придумать действия!
Ответ 8
Лучший способ сделать это - связать значение NSTextField с свойством NSString.
Например, определите метод:
(void)setTextFieldString:(NSString *)addressString {}
добавить привязки:
[textField bind:@"value" toObject:self withKeyPath:@"self.textFieldString" options:nil];
Введите текст и нажмите клавишу возврата, setTextFieldString будет вызываться.



