2011-06-09 11 views
5

Tengo dos NSTextField s: y textFieldPassword.NSTextField Enter key detection o firstResponder detection

Para textFieldPassword, que tienen un delegado de la siguiente manera:

- (void)controlTextDidEndEditing:(NSNotification *)aNotification 

Este delegado se llama cuando textFieldPassword tiene el foco y me golpeó la tecla enter. Esto es exactamente lo que quiero.

Mi problema es que controlTextDidEndEditing también se llama cuando textFieldPassword tiene el foco y muevo el foco a textFieldUserID (mediante el mouse o la tecla de tabulación). Esto no es lo que quiero.

Intenté usar la notificación controlTextDidChange (que se llama una vez por pulsación de tecla) pero no pude averiguar cómo detectar la tecla Intro ([textFieldPassword stringValue] no incluye la tecla Intro). ¿Puede alguien ayudarme a resolver esto?

También traté de detectar si textFieldUserID era firstResponder, pero no funcionó para mí. Este es el código que probé:

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"); 
    } 
} 

¡De seguro podría necesitar ayuda aquí!

Respuesta

14

Si lo entendí correctamente, podría establecer una acción para el campo de texto de la contraseña y decirle al campo que envíe su acción solo cuando el usuario escriba Devuelva. En primer lugar, declare e implemente una acción en la clase responsable del comportamiento cuando el usuario escriba Devuelva en el campo de contraseña. Por ejemplo:

@interface SomeClass … 
- (IBAction)returnOnPasswordField:(id)sender; 
@end 

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

Hacer el campo de texto enviar su acción sobre Volver solamente, y la vinculación de la acción a un determinado IBAction y de destino, puede hacerse ya sea en el Interface Builder o mediante programación.

En Interface Builder, utilizar el inspector de atributos, seleccione Acción: Se envía en Enter Sólo, y luego vincular la acción campo de texto a un IBAction en el objeto que lo implementa, potencialmente el propietario del archivo o la primera respuesta.

Si prefiere hacerlo mediante programación, entonces:

// 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

Sírvanse proporcionar detalles sobre cómo este código responde a la pregunta. – JAL