【问题标题】:NSTextField enter key detection or firstResponder detectionNSTextField 输入键检测或firstResponder检测
【发布时间】:2011-06-09 07:15:31
【问题描述】:

我有两个NSTextFields:textFieldUserIDtextFieldPassword

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

- (void)controlTextDidEndEditing:(NSNotification *)aNotification

textFieldPassword 获得焦点并且我按下回车键时,会调用此委托。这正是我想要的。

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

我尝试使用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");
    }
}

我当然可以在这里使用一些帮助!

【问题讨论】:

    标签: cocoa nstextfield


    【解决方案1】:

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

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

    使文本字段仅在 Return 时发送其操作,并将操作链接到给定的IBAction 和目标,可以在 Interface Builder 中或以编程方式完成。

    在 Interface Builder 中,使用 Attributes Inspector,选择 Action: Sent on Enter Only,然后将文本字段操作链接到实现它的对象中的 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];
    

    【讨论】:

      【解决方案2】:
      [passwordTextFieldCell setTarget:self];
      
      [passwordTextFieldCell setAction:@selector(someAction:)];
      
      - (void) someAction{
      
      //handle
      
      }
      

      【讨论】:

      • 请详细说明这段代码是如何回答这个问题的。
      猜你喜欢
      • 1970-01-01
      • 2017-03-29
      • 2014-04-18
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2012-09-10
      • 2013-07-22
      相关资源
      最近更新 更多