2011-06-09 79 views
5

我有两个NSTextField s:textFieldUserIDtextFieldPasswordNSTextField输入密钥检测或firstResponder检测

对于textFieldPassword,我有一个委托如下:当textFieldPassword已集中

- (void)controlTextDidEndEditing:(NSNotification *)aNotification 

此委托被调用,我按下回车键。这正是我想要的。

我的问题是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"); 
    } 
} 

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

回答

14

如果我正确理解了您的意思,您可以设置密码文本字段的操作并告诉该字段只有在用户键入返回时才发送其操作。首先,在用户输入密码字段中键入返回时,声明并实施负责该行为的类中的操作。例如:

@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]; 
0
[passwordTextFieldCell setTarget:self]; 

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

- (void) someAction{ 

//handle 

} 
+0

请对这个代码是如何回答这个问题阐述。 – JAL 2016-04-01 02:38:37