NSTextField输入密钥检测或firstResponder检测

时间:2011-06-09 07:15:31

标签: cocoa nstextfield

我有两个NSTextFieldtextFieldUserIDtextFieldPassword

对于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 个答案:

答案 0 :(得分:14)

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

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

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

使文本字段仅在返回上发送其操作,并将操作链接到给定的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];

答案 1 :(得分:0)

[passwordTextFieldCell setTarget:self];

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

- (void) someAction{

//handle

}