我有两个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");
}
}
我肯定可以在这里使用一些帮助!
答案 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
}