2010-09-16 20 views
10

Soy novato con cocoa. Tengo un botón y un campo de texto en mi aplicación. Quiero que el botón se deshabilite cuando el campo de texto está vacío y habilitado cuando el usuario escribe algo.Desactivar/Activar NSButton si NSTextfield está vacío o no

¿Algún punto para comenzar? ¿Alguna vinculación "mágica" en Interface Builder?

Gracias

[Editado]

he intentado ajustar el AppDelegate como el delegado NSTextfield's y ha añadido este método (myTextField y myButton son IBOutlets):

- (void)textDidChange:(NSNotification *)aNotification 
{ 
    if ([[myTextField stringValue]length]>0) { 
     [myButton setEnabled: YES]; 
    } 
    else { 
     [myButton setEnabled: NO]; 
    } 
} 

Pero no pasa nada ...

+0

Podría intentar hacer lo mismo con [myTextField.text isEqualToString: @ ""] en su condición de lugar? – jv42

Respuesta

13

He intentado configurar la aplicaciónDelegate como el delegado de NSTextfield y he añadido t su método (myTextField y myButton son IBOutlets):

- (void)textDidChange:(NSNotification *)aNotification 
{ 
    if ([[myTextField stringValue]length]>0) { 
     [myButton setEnabled: YES]; 
    } 
    else { 
     [myButton setEnabled: NO]; 
    } 
} 

Esa es la manera más difícil, pero debería funcionar bien. O bien no ha conectado la salida delegate del campo de texto a este objeto, no ha conectado la salida myTextField al campo de texto, o no ha conectado la salida myButton al botón.

La otra forma sería la de dar a los inspectores una propiedad exponer el valor de cadena, atar el campo de texto de value unión a este stringValue bienes y en el botón de enabled unión al controlador de stringValue.length.

También podría darle al controlador dos propiedades, una que tenga un valor booleano, configurarla como dependiente de la propiedad de cadena, y vincular el botón a esa. Esa es una solución más limpia y posiblemente más robusta, aunque es más trabajo.

+1

Hola Peter. Después de algunos meses, necesito resolver esto de nuevo con otra aplicación. Ahora que mi conocimiento sobre los enlaces (y el cacao) es mejor, he intentado con su solución y funciona perfecto. ¡Y solo con una propiedad y dos ataduras! (Mucho más limpio que usar métodos delegados, observadores y puntos de venta ...) Muchas gracias – Azpiri

0

Gracias Peter. Lo que me faltaba (en mi versión de forma más dura) es este pedazo de código en el awakeFromNib en el AppDelegate:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 
[center addObserver:self selector:@selector(textDidChange:) name:NSControlTextDidChangeNotification object:myTextField]; 

Funciona perfecto. Ahora lo estoy intentando de la manera fácil, pero me temo que aún no soy lo suficientemente bueno con las ataduras.

Para enlazar la propiedad

@property (retain) IBOutlet NSString *aStringValue; 

con el valor textfield's, lo que tengo que usar en el IB para "Bind to:", "Clave Controller" y "Ruta de la clave del modelo"?

3

Si usa controlTextDidChange en lugar de textDidChange, puede deshacerse de las notificaciones y solo confiar en ser el delegado de NSTextField.

9

Aquí hay una solución que usa enlaces.

A continuación configuro un NSTextField que está vinculado a la propiedad de "texto" del propietario del archivo. "texto" es un NSString. Me atrapó el "Valor de actualizaciones continuas". Pensando que mi solución no funcionaba, pero en realidad no se actualizaba a medida que el usuario escribía, y solo cuando el campo de texto perdía el foco.

Binding the NSTextField to the file's owner NSString text property

Y ahora la creación de fijaciones en el botón, basta con establecer su estado habilitado a la longitud de la propiedad text del propietario del archivo.

Binding the NSButton's enabled state to the text property's length

Annd, el producto de trabajo.

enter image description here enter image description here

+0

Lamentablemente, la interfaz de usuario ha cambiado un poco en Xcode 8. Creé una propiedad 'dynamic var text: NSString' y pude enlazar 'self.text 'al campo de texto, pero no pude hacer funcionar la segunda parte. ¿Qué pones para la "llave del controlador"? – wcochran