Pregunta

Tengo una interfaz gráfica de usuario basada vista que contiene un campo de texto para cada elemento de interfaz gráfica de usuario. Cuando selecciono otro elemento de menú Quiero que mis campos de texto para salir del modo de edición. No pude encontrar modos de hacer esto en la documentación NSTextField. ¿Algunas ideas?

¿Fue útil?

Solución

Es necesario decir la ventana para quitar 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.

Otros consejos

La siguiente solución de cocoabuilder. com - Detener la sesión de edición con un NSTextField funciona para mí, tanto en OS X 10.9 y OS X 10.10 de Objective-C y el 10,10 por 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 un poco de no-nil subclase NSResponder (esto puede ser o bien ver el contenido del NSWindow o punto de vista de NSViewController que tanto el trabajo en mi caso o algún punto de vista falso NSTextField que no es visible para el usuario para los casos más complejos).

Detalle importante: -[NSWindow makeFirstResponder] debe ser invocado exactamente dentro del selector de la acción de NSTextField como mi ejemplo demuestra. Ningún otro lugar en la tubería método NSTextField hizo el trabajo para mí (textDidEndEditing :, textShouldEndEditing: o control: textShouldEndEditing:)

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()
}

Swift 4.2 udpate, nil hace que la ventana de su primera respuesta. Se lanzaría error.

DispatchQueue.main.async {
    self.window?.makeFirstResponder(nil)
}

Este comando se debe utilizar en viewWillLayout y si es necesario en viewWillAppear y. Y eso es todo. No hay subclases y hilos paralelos.

[textField.window makeFirstResponder:nil];

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

Para las ventanas modales utilizan viewDidAppear o dispatch_async:

dispatch_async(dispatch_get_main_queue(), ^{
        [textField.window makeFirstResponder:nil];
    });
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top