Cocoa NSTextField输入密钥检测或第一响应者检测

Cocoa NSTextField输入密钥检测或第一响应者检测,cocoa,nstextfield,Cocoa,Nstextfield,我有两个NSTextFields:textFieldUserID和textFieldPassword 对于textFieldPassword,我有一个代表,如下所示: - (void)controlTextDidEndEditing:(NSNotification *)aNotification 当textFieldPassword具有焦点且我按下回车键时,将调用此委托。这正是我想要的 我的问题是,当textFieldPassword具有焦点时,controltextdidediting也会被

我有两个
NSTextField
s:
textFieldUserID
textFieldPassword

对于
textFieldPassword
,我有一个代表,如下所示:

- (void)controlTextDidEndEditing:(NSNotification *)aNotification
textFieldPassword
具有焦点且我按下回车键时,将调用此委托。这正是我想要的

我的问题是,当
textFieldPassword
具有焦点时,
controltextdidediting
也会被调用,我将焦点移动到
textFieldUserID
(通过鼠标或tab键)。这不是我想要的

我尝试使用
controlTextDidChange
通知(每次按键都会调用一次),但我无法确定如何检测回车键(
[textFieldPassword stringValue]
不包括回车键)。有人能帮我弄清楚这个吗

我还试图检测
textFieldUserID
是否是
第一响应者,但它对我不起作用。以下是我试用过的代码:

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");
    }
}

我当然需要一些帮助

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

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

@implementation SomeClass
- (IBAction)returnOnPasswordField:(id)sender {
    // do something
}
@end
使文本字段仅在返回时发送其操作,并将操作链接到给定的
iAction
和目标,可以在Interface Builder中完成,也可以通过编程方式完成

在Interface Builder中,使用属性检查器,选择Action:Sent on Enter Only,然后将文本字段操作链接到实现它的对象中的
iAction
,可能是文件的所有者或第一响应者

如果您更愿意按程序进行,那么:

// 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];

请详细说明此代码如何回答此问题。
[passwordTextFieldCell setTarget:self];

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

- (void) someAction{

//handle

}