NSTextField вводит для запуска действия
Я искал все для простого примера того, как заставить действие (или кнопку) запускаться, когда клавиша ввода попадает в текстовое поле.
Должен ли я подклассировать текстовое поле? Должен ли я установить делегата для вызова необходимого мне действия? Есть ли способ поймать событие в моем классе контроллера главного окна?
Если бы вы могли просто указать мне в правильном направлении, это было бы здорово. Спасибо.
Ответы
Ответ 1
Чтобы получить действие после того, как вы нажмете Enter, просто напишите IBAction в своем оконном контроллере и подключитесь к текстовому полю. Если вы хотите больше, как ваш метод следует вызывать, когда вы фокусируетесь на текстовом поле и оставляете текстовое поле, вам нужно установить делегат (См. Здесь).
Ответ 2
Сайт, на который ссылаются в комментариях к принятому ответу... теперь "ПОДОЗРЕВАЕТСЯ" веб-хостом, а в кеше 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, чтобы реагировать на это.
Ответ 3
Просто подключите IBAction вашего класса контроллера с текстовым полем. Действие должно быть вызвано, если вы нажмете enter или оставьте текстовое поле с помощью Tab или Mouse.
Ответ 4
Для любопытных здесь, как реализовать -controlTextDidEndEditing:(NSNotification)obj
(если вам не нужно отвечать только на клавишу ввода)
AppDelegate.h:
// Conform to the protocol to avoid compiler warnings
@interface myClass : NSObject <NSTextFieldDelegate>
// Link up to the interface elements you want to trigger
@property (weak) IBOutlet NSTextField *myTextField;
@property (weak) IBOutlet NSButton *myButton;
// Create an action linked to myButton
- (IBAction)myButtonPressed:(id)sender;
// Advertise that you implement the method
- (void)controlTextDidEndEditing:(NSNotification *)obj;
AppDelegate.m:
@synthesize myTextField = _myTextField;
@synthesize myButton = _myButton;
// Make yourself the delegate
- (void)applicationDidFinishLoading:(NSNotification *)aMessage {
_myTextField.delegate = self;
}
// NSTextField objects send an NSNotification to a delegate if
// it implements this method:
- (void)controlTextDidEndEditing:(NSNotification *)obj {
if ([[obj object] isEqual:_textField]) {
[self myButtonPressed:nil]; // nil = sender
}
}
Работала как прелесть для меня.
Ответ 5
Лучше всего было бы использовать control + drag
для действия, которое вы уже создали, поэтому нажатие return
также вызовет действие.