NSTextField输入密钥检测或firstResponder检测

Dho*_*lla 5 cocoa nstextfield

我有两个NSTextField:textFieldUserIDtextFieldPassword.

因为textFieldPassword,我有一个代表如下:

- (void)controlTextDidEndEditing:(NSNotification *)aNotification
Run Code Online (Sandbox Code Playgroud)

textFieldPassword有焦点时我会调用此委托,然后按Enter键.这正是我想要的.

我的问题是,controlTextDidEndEditingtextFieldPassword有焦点时我也会被调用,并且我将焦点移动到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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我肯定可以在这里使用一些帮助!

小智 14

如果我理解正确,您可以为密码文本字段设置操作,并告诉字段仅在用户键入时发送其操作Return.首先,在用户键入Return密码字段时,在类中声明并实现一个负责行为的操作.例如:

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

@implementation SomeClass
- (IBAction)returnOnPasswordField:(id)sender {
    // do something
}
@end
Run Code Online (Sandbox Code Playgroud)

使文本字段Return仅发送其操作,并将操作链接到给定IBAction目标和目标,可以在Interface Builder中或以编程方式完成.

在Interface Builder中,使用"属性"检查器,选择"操作:仅在输入时发送",然后将文本字段操作链接到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];
Run Code Online (Sandbox Code Playgroud)