NSTextField вводит, чтобы вызвать действие - PullRequest
12 голосов
/ 14 апреля 2010

Я все время искал простой пример того, как заставить действие (или кнопку) срабатывать при нажатии клавиши ввода в текстовом поле.Нужно ли мне назначить делегата для вызова нужного мне действия?Есть ли способ поймать событие в моем классе контроллера главного окна?

Если бы вы могли просто указать мне правильное направление, это было бы здорово.Спасибо.

Ответы [ 5 ]

22 голосов
/ 16 мая 2011

Сайт, на который ссылаются в комментариях к принятому ответу ... теперь "приостановлен" веб-хостом, и в кеше Google нет скриншота, содержащего ключевой шаг.

Итак, вот альтернативное решение, которое я нашел, что:

  1. отлично работает
  2. НЕ требует подклассов

Для некоторых клавиш (Enter, Delete, Backspace и т. Д.) Apple НЕ вызывает обычные методы controlTextDidEndEditing: и т. Д. Вместо этого 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;  
}

В моем случае я тоже хотел переопределить клавишу возврата - запустив приложение этим методом, я получил вывод о том, что селектор был «deleteBackward:», поэтому я добавил еще один оператор if, чтобы среагировать на это.

9 голосов
/ 14 апреля 2010

Чтобы получить действие после нажатия Enter, просто напишите IBAction в вашем контроллере окна и подключитесь к текстовому полю. Если вы хотите больше, чтобы ваш метод вызывался, когда вы фокусировались на текстовом поле и оставляли текстовое поле, вам нужно установить делегат ( См. Здесь ).

2 голосов
/ 14 апреля 2010

Просто подключите IBAction вашего класса контроллера с текстовым полем. Действие должно вызываться нажатием клавиши ввода или выхода из текстового поля с помощью клавиши Tab или мыши.

1 голос
/ 03 августа 2014

Лучше всего использовать control + drag для действия, которое вы уже создали, поэтому нажатие return также вызовет действие.

1 голос
/ 21 января 2013

Для любопытных, вот как реализовать -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
    }
}

Сработало для меня как оберег.

...