NSTextField введите ключ обнаружения или первый ответчик обнаружения - PullRequest
5 голосов
/ 09 июня 2011

У меня есть два NSTextField с: textFieldUserID и textFieldPassword.

Для textFieldPassword у меня есть следующий делегат:

- (void)controlTextDidEndEditing:(NSNotification *)aNotification

Этот делегат вызывается, когда textFieldPassword имеет фокус, и я нажимаю клавишу ввода. Это именно то, что я хочу.

Моя проблема в том, что controlTextDidEndEditing также вызывается, когда у textFieldPassword есть фокус, и я перемещаю фокус на textFieldUserID (с помощью мыши или клавиши табуляции). Это НЕ то, что я хочу.

Я пытался использовать уведомление controlTextDidChange (которое вызывается один раз при нажатии клавиши), но я не смог выяснить, как обнаружить клавишу ввода ([textFieldPassword stringValue] не включает клавишу ввода). Может кто-нибудь помочь мне разобраться с этим?

Я также пытался определить, был ли textFieldUserID firstResponder, но у меня это не сработало. Вот код, который я опробовал:

if ( [[[self window] firstResponder] isKindOfClass:[NSTextView class]] &&
    [[self window] fieldEditor:NO forObject:nil] != nil ) {
    NSTextField *field = [[[self window] firstResponder] delegate];
    if (field == textFieldUserID) {
        // do something based upon first-responder status
        NSLog(@"is true");
    }
}

Я уверен, что мог бы помочь здесь!

Ответы [ 2 ]

14 голосов
/ 09 июня 2011

Если я вас правильно понял, вы можете установить действие для текстового поля пароля и указать полю отправлять свое действие только тогда, когда пользователь наберет Return .Во-первых, объявите и реализуйте действие в классе, ответственное за поведение, когда пользователь вводит Return в поле пароля.Например:

@interface SomeClass …
- (IBAction)returnOnPasswordField:(id)sender;
@end

@implementation SomeClass
- (IBAction)returnOnPasswordField:(id)sender {
    // do something
}
@end

Заставить текстовое поле отправлять свое действие только на Return и связать действие с указанным IBAction и целью, можно сделать либо в Интерфейсном Разработчике, либопрограммно.

В Интерфейсном Разработчике используйте Инспектор Атрибутов, выберите Действие: Отправлено только при вводе , а затем свяжите действие текстового поля с IBAction в объекте, который его реализует,потенциально владелец файла или первый ответчик.

Если вы предпочитаете делать это программно, то:

// Make the text field send its action only when Return is pressed
[passwordTextFieldCell setSendsActionOnEndEditing:NO];

// The action selector according to the action defined in SomeClass
[passwordTextFieldCell setAction:@selector(returnOnPasswordField:)];

// someObject is the object that implements the action
[passwordTextFieldCell setTarget:someObject];
0 голосов
/ 21 января 2014
[passwordTextFieldCell setTarget:self];

[passwordTextFieldCell setAction:@selector(someAction:)];

- (void) someAction{

//handle

}
...