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
}