¿Obteniendo el valor de un UITextField cuando se ingresan las pulsaciones de teclas?

107

Digamos que tengo el siguiente código:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

Me gustaría greetingLabelleer "Hola [nameTextField]" tan pronto como el usuario presione cualquier tecla.

Lo que necesito básicamente es el iPhone equivalente al método delegado Cocoa controlTextDidChange.

El textField:shouldChangeCharactersInRange:método delegado se llama cada vez que se pulsa una tecla:

- (BOOL)              textField:(UITextField *)textField
  shouldChangeCharactersInRange:(NSRange)range     
              replacementString:(NSString *)string

El argumento de cadena devuelve el carácter que se presiona. Sin embargo, el textFieldvalor actual ( nameTextField.text) permanece en blanco.

¿Que me estoy perdiendo aqui? (Me gustaría nameTextFieldreflejar la cadena exacta que el usuario ha ingresado hasta ahora).

PlagueHammer
fuente

Respuestas:

197

Resulta que la forma más sencilla de hacerlo es utilizando Interface Builder:

  • Agregue una IBAction (al ViewController, digamos, como en este caso)
  • Ctrl-clic (o clic derecho) en UITextField en Interface Builder
  • Conecte el evento "Editing Changed" a la IBAction del propietario del archivo agregada en el primer paso.

Funciona a las mil maravillas :) (No puedo creer que pasé varios días en esto, y ahora me doy cuenta de que la solución era mucho más simple de lo que pensaba: P)

PlagueHammer
fuente
2
¡Gracias! Había estado usando "Value Changed" como lo usaría con un UISlider, etc. Es interesante que tengan dos eventos que parecen tener el mismo comportamiento.
wjl
1
Por alguna razón, todavía quería una forma programática de hacer esto ... pero cedí ... ¡Este método es genial! Gracias por compartir ... Lo había visto antes pero después de días de codificar mi cerebro ya no funciona jeje.
Albert Renshaw
8
@AlbertRenshaw Pero puedes hacer esto de manera programática;) Simplemente hazlo [textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];).
Vive el
101

puede registrar una acción para el evento UIControlEventEditingChanges en el campo de texto:

[nameTextField addTarget:self action:@selector(updateLabelUsingContentsOfTextField:) forControlEvents:UIControlEventEditingChanged];

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

    greetingLabel.text = [NSString stringWithFormat:@"Hello %@", ((UITextField *)sender).text];

}

fuente
¿Hay alguna forma de especificar esto usando Interface Builder?
PlagueHammer
11

UITextFieldtiene una notificación UITextFieldTextDidChangeque se disparará cada vez que el texto cambie si te registras. Simplemente regístrese para recibir esa notificación y, en el método llamado por la notificación, cambie el texto de la etiqueta.

Para agregar a esto, el objeto pasado a su controlador de notificaciones tendrá el texto del UITextField.

Espero que ayude.

perdido en el transito
fuente