2010-02-17 11 views
14

Tengo una interfaz gráfica de usuario basada en vista que contiene un campo de texto para cada elemento de la interfaz gráfica de usuario. Cuando selecciono otro elemento del menú, quiero que mis campos de texto salgan del modo de edición. No pude encontrar de todos modos para hacer esto en los documentos nsTextField. ¿Algunas ideas?Forzar un campo de texto Cocoa para finalizar la edición

Respuesta

39

tiene que decirle a la ventana para eliminar primero el estado de respuesta del control:

[[textField window] makeFirstResponder:nil]; 

Esto va a terminar la edición y quitar el foco del campo de texto.

+0

Esto debería ser un FAQ – uchuugaka

+2

no funciona (al menos en Yosemite). –

+1

Funciona bien en Yosemite aquí. ¿Estás llamando desde el hilo principal? \t 'dispatch_async (dispatch_get_main_queue(),^{[textField.window makeFirstResponder: nil];});' –

11

La siguiente solución de cocoabuilder.com - Stop edit session with a NSTextField me funciona tanto en OS X 10.9 como en OS X 10.10 para Objective-C y en 10.10 para Swift.

He aquí la versión de Objective-C:

@implementation CustomTextField 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 

    self.target = self; 
    self.action = @selector(action:); 

    return self; 
} 

- (void)action:(NSTextField *)textField { 
    // Make something else first responder, something neutral 
    // (or can be a fake invisible element) 
    [self.window makeFirstResponder:self.window.contentView]; 

    // Other code 
} 

@end 

Antecedentes: se acepta la solución en este tema nunca trabajó para mí en OS X 10.9 y 10.10 así que en lugar de llamar [[textField window] makeFirstResponder:nil]; ya que sugiere - que tenía que llamar makeFirstResponder con alguna subclase NSResponder no nula (esta puede ser la vista de contenido de NSWindow o la vista de NSViewController que ambos funcionan en mi caso o una vista falsa de NSTextField que no es visible para casos más complejos).

Detalles importantes: -[NSWindow makeFirstResponder] deben invocarse exactamente dentro del selector de acciones de NSTextField como muestra mi ejemplo. Ningún otro lugar en la tubería método NSTextField hizo el trabajo para mí (textDidEndEditing :, textShouldEndEditing: o control: textShouldEndEditing :)

+1

aunque extraño, esta también fue la única solución que funcionó para mí. – Christian

+1

de hecho esto funciona mientras que la respuesta aceptada no lo hace, en Yosemite –

+0

Si había llamado al método desde la respuesta anterior en viewWillLayout, habría hecho todo en una fila sin crear ninguna subclase. – iSavaDevRU

4

sé que esto es una cuestión de edad, pero en caso de que alguien se está preguntando acerca veloz 3, que sólo funcionaba para mí con
DispatchQueue.main.async{ self.window?.makeFirstResponder() }

+1

¡guau! ¡me salvaste la vida! – Vincenso

+0

No sé cómo salvar mi vida, pero esto realmente me ayudó. :) También quiero señalar que en mi caso no fue makeFirstResponder sino resignFirstResponder que tuvo que ser envuelto en la Cola de Despacho. – Chris

0

Este comando se debe utilizar en viewWillLayout y si necesidad de viewWillAppear y. Y eso es todo. Sin subclases e hilos paralelos.

[textField.window makeFirstResponder:nil]; 

Esto funciona bien con la ventana principal. Pero esto no funciona bien con ventanas modales.

Para usar ventanas modales viewDidAppear o dispatch_async:

dispatch_async(dispatch_get_main_queue(), ^{ 
     [textField.window makeFirstResponder:nil]; 
    }); 
Cuestiones relacionadas