La respuesta de @ Rob presumiblemente funcionó en un punto, pero como @Daniel no ted, ya no funciona. Parece que Cocoa quiere rastrear el mouse y arrastrar una selección en respuesta a un clic, y tratar de seleccionar el texto en respuesta al becomeFirstResponder
no funciona bien con eso.
El evento del mouse debe ser interceptado, entonces, para evitar ese seguimiento. Más o menos por ensayo y error, he encontrado una solución que parece funcionar en OS X 10.10:
@interface MyAutoselectTextField : NSTextField
@end
@implementation MyAutoselectTextField
- (void)mouseDown:(NSEvent *)theEvent
{
[[self currentEditor] selectAll:nil];
}
@end
Por lo que yo puedo decir, en el momento en mouseDown:
es llamada el editor de campo ya se ha establecido arriba, probablemente como un efecto secundario de becomeFirstResponder
. Llamando al selectAll:
, luego selecciona el contenido del editor de campo. Llamar al selectText:
en self
en su lugar no funciona bien, presumiblemente porque el editor de campo está configurado.Tenga en cuenta que la anulación de mouseDown:
aquí hace no llame al super
; super
ejecutaría un bucle de seguimiento que arrastraría una selección, y no queremos ese comportamiento. Tenga en cuenta que esta anulación de mouseDown:
no afecta a la selección una vez que el campo de texto se ha convertido en el primero en responder, porque en ese punto es el mouseDown:
del editor de campo el que recibe la llamada.
No tengo idea de qué rango de versiones de OS X esto funciona; si te importa, deberás probarlo. Desafortunadamente, trabajar con NSTextField
siempre es un poco frágil porque la manera en que trabajan los editores de campo es tan extraña y depende de los detalles de implementación en super
.
muchas gracias, funcionó muy bien y me hizo aprender algunas cosas. que creó el archivo .m a partir del código que ya ha proporcionado, el archivo .h de este modo: import @interface MCTextField: NSTextField {} @end Y en Interface Builder, me fui a Archivo -> Leer archivo de clase, seleccioné MCTextField.h, luego cambié la clase de mi campo de texto para que fuera MCTextField. –
Esta es TAMBIÉN la solución para una gran cantidad de "seleccionar texto mediante programación" general - las rutinas de selección de texto en NSTextView, por ejemplo, no se activan correctamente si se invocan directamente en muchas ocasiones, debe ponerlas en un selector de rendimiento : afterDelay: 0 llamada. Suspiro – Adam
Esto no parece funcionar bien en 10.9 SDK. Cuando hago clic en el campo, obtengo un cursor intermitente a menos que puse una demora muy larga, como 1 segundo. –