2011-06-09 40 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