Подтвердить что ты не робот

NSTextField вводит для запуска действия

Я искал все для простого примера того, как заставить действие (или кнопку) запускаться, когда клавиша ввода попадает в текстовое поле.

Должен ли я подклассировать текстовое поле? Должен ли я установить делегата для вызова необходимого мне действия? Есть ли способ поймать событие в моем классе контроллера главного окна?

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

4b9b3361

Ответ 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 также вызовет действие.