Forzando un campo de texto Cocoa para finalizar la edición
macos nstextfield (4)
Debe indicar a la ventana que elimine el estado del primer respondedor del control:
[[textField window] makeFirstResponder:nil];
Esto finalizará la edición y eliminará el foco del campo de texto.
Tengo una interfaz gráfica de usuario basada en vistas 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?
Este comando se debe usar en viewWillLayout y si es necesario en viewWillAppear y. Y eso es todo. No hay subclases ni hilos paralelos.
[textField.window makeFirstResponder:nil];
Esto funciona bien con la ventana principal. Pero esto no funciona bien con las ventanas modales.
Para ventanas modales use viewDidAppear o dispatch_async:
dispatch_async(dispatch_get_main_queue(), ^{
[textField.window makeFirstResponder:nil];
});
La siguiente solución de cocoabuilder.com: detener la sesión de edición con un NSTextField me funciona tanto en OS X 10.9 como en OS X 10.10 para Objective-C y en 10.10 para Swift.
Aquí está 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: la solución aceptada en este tema nunca me funcionó en OS X 10.9 y 10.10, así que en lugar de llamar a [[textField window] makeFirstResponder:nil];
como sugiere - necesitaba llamar a makeFirstResponder
con alguna subclase NSResponder no nula (puede ser la vista de contenido de NSWindow o la vista NSViewController que funciona en mi caso o alguna vista NSTextField falsa que no es visible para el usuario en casos más complejos).
Detalle importante: -[NSWindow makeFirstResponder]
debe invocarse exactamente dentro del selector de acción de NSTextField como lo demuestra mi ejemplo. Ningún otro lugar en la canalización del método NSTextField funcionó para mí (textDidEndEditing :, textShouldEndEditing: o control: textShouldEndEditing :)
Sé que esta es una pregunta antigua, pero en caso de que alguien se esté preguntando acerca de Swift 3, solo funcionó para mí
DispatchQueue.main.async {
self.window?.makeFirstResponder()
}
Swift 4.2 udpate, nil
hace que la ventana sea su primer respondedor. De lo contrario arroja un error.
DispatchQueue.main.async {
self.window?.makeFirstResponder(nil)
}