2011-05-11 11 views
8

He estado tratando de aprender a usar Xcode, pero me confunde con la forma de registrar que NSTextField ha cambiado. Esencialmente, tengo un NSTextField y un botón. Hacer clic en el botón hace cosas con el texto en el campo. Sin embargo, quiero poder obtener el texto del campo sin necesidad de usar el campo de texto "Acción: enviar al final de la edición". Es decir, quiero poder ingresar texto e inmediatamente presionar el botón, sin presionar enter o tabbing fuera del cuadro de texto. Parece que la forma de hacerlo sería mediante el establecimiento de un delegado para mi NSTextField que responde aNSTextField notificaciones de delegado: ¿cómo obtener texto?

- (void)controlTextDidChange:(NSNotification *)aNotification 

Pero no entiendo cómo obtener el texto que se ha introducido. Supongo que tiene algo que ver con

[[aNotification userInfo] valueForKey:@"NSFieldEditor"]; 

pero realmente no tengo ni idea de dónde ir desde allí.

Respuesta

10

Estás en el camino correcto! El objeto que obtienes del diccionario de información de usuario de la notificación es Field Editor, que es simplemente un NSTextView que maneja la entrada de texto en nombre del campo de texto.

Una vez que tenga ese objeto, todo lo que tiene que hacer es pedirle su textStorage, que es un objeto NSTextStorage * que contiene el texto. Ese objeto, a su vez, tiene su string que es un simple viejo NSString que contiene solo los caracteres.

NSTextView * fieldEditor = [[aNotification userInfo] objectForKey:@"NSFieldEditor"]; 
NSString * theString = [[fieldEditor textStorage] string]; 

* Una subclase de NSAttributedString, que es un objeto que sostiene una cadena y se asocia "atributos" como el color, la fuente y el subrayado.

+0

¿Puedo sugerir '-objectForKey:' en lugar de '-valueForKey:'? El primero es el método canónico para obtener un valor de un diccionario. –

+0

@Bavarious: ¡Tienes razón, como de costumbre! Culpable de haber copiado la línea de código del OP sin leerla cuidadosamente. –

+0

¡Gracias! Eso funciona maravillosamente! – Daniel

2

En su método de acción del botón, basta con leer el valor de cadena actual en el campo de texto:

- (IBAction)didClickTheButton:(id)sender { 

    NSString* theString = [myTextField stringValue]; 

    // do something with theString 

} 
+0

Guau, eso es mucho más fácil. ¿Por qué la otra respuesta, que parece tan intrincada, actualmente tiene una calificación más alta? – SilverSideDown

+0

@SilverSideDown Al menos cuando hice la pregunta, esto no registrará el texto que se ha ingresado sin que el usuario haya marcado la pestaña, o presionando return. – Daniel

+2

Si usa enlaces de datos, puede configurar la opción "Valor de actualizaciones continuas" y eso actualizará el valor encuadernado a medida que escribe sin necesidad de presionar return o tab. Llamar al método -stringValue devolverá el texto actual en NSTextField independientemente. – Darren

0

Si está solamente siempre el manejo de un solo campo de texto, esto puede ser más simple:

- (void)controlTextDidChange:(NSNotification *)obj { 
    [self.inputField stringValue]; 
} 

estoy ignorando por completo todos los detalles complicados de NSText y todo eso y simplemente utilizando la simplicidad de la notificación siendo enviado y la simplicidad de obtener el valor de cadena de un campo de texto.

Cuestiones relacionadas