textfielddidchange shouldchangecharactersin begin objective-c ipad ios6 uitextfield uitextfielddelegate

objective-c - shouldchangecharactersin - textfielddidchange swift 3



Detectando un cambio en el texto en el campo (7)

Aproveche la notificación de UITextFieldTextDidChange o establezca un delegado en el campo de texto y observe el campo de texto: shouldChangeCharactersInRange: replacementString.

Si desea observar los cambios con una notificación, necesitará algo como esto en su código para registrarse para la notificación:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:theTextField];

Aquí theTextField es la instancia de UITextField que desea ver. La clase de la cual self es una instancia en el código anterior debe implementar textFieldDidChange, así:

- (void)textFieldDidChange:(NSNotification *)notification { // Do whatever you like to respond to text changes here. }

Si el campo de texto va a sobrevivir al observador, entonces debe cancelar el registro para recibir notificaciones en el método dealloc del observador. En realidad, es una buena idea hacer esto incluso si el campo de texto no sobrevive al observador.

- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; // Other dealloc work }

Me gustaría poder detectar si se cambia algún texto en un UITextField para que luego pueda habilitar un UIButton para guardar los cambios.


En lugar de observar notificaciones o implementar textField:shouldChangeCharacterInRange:replacementString: es más fácil simplemente agregar un objetivo de evento:

[textField addTarget:self action:@selector(myTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; - (void)myTextFieldDidChange:(id)sender { // Handle change. }

Tenga en cuenta que el evento es UIControlEventEditingChanged y no UIControlEventValueChanged !

Las ventajas sobre las otras dos soluciones sugeridas son:

  • No es necesario recordar anular el registro de su controlador con el NSNotificationCenter .
  • Se llama al controlador de eventos después de que se haya realizado el cambio, lo que significa que textField.text contiene el texto que el usuario realmente ingresó. El textField:shouldChangeCharacterInRange:replacementString: delegate se llama antes de que se apliquen los cambios, por lo que textField.text aún no le da el texto que el usuario acaba de ingresar; primero deberá aplicar el cambio usted mismo.

Esto se puede lograr en Interface Builder en el evento Editing Changed de UITextField . Arrástrelo a su código y cree una IBAction .

Por ejemplo:

@IBAction func textFieldChanged(_ sender: UITextField) { print(sender.text) }

Este evento es el mismo que se describe en otras respuestas aquí en que la propiedad .text contiene la entrada de texto actualizada cuando se activa. Esto puede ayudar a limpiar el desorden de códigos al no tener que agregar el evento a cada UITextField en la vista mediante programación.


Para eso, primero necesita que su campo de texto tenga un delegado de referencia asignado. Y el delgate, preferiblemente debería ser, el controlador vew que es el propietario de los archivos de la vista. Que va como

myTextField.delegate = myViewControllerReferenceVariable

Y en su interfaz de viewController, dígale que implementará UITextFieldDelegate by

@interface MyViewController:UIViewController<UITextFieldDelegate>

Y en su vista anular la implementación del controlador

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

Así el código se verá como

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { text = [textfield.text stringByReplacingCharactersInRange:range withString:string]; if (textfield == refToTextFieldYouWantToCheck) { if ( ! [textToCheck isEqualToString:text] ) { [theButtonRef setEnabled:YES]; } } return YES; //If you don''t your textfield won''t get any text in it }

También puede suscribirse a la notificación, que es una especie de IMHO desordenado. Puede encontrar cómo hacerlo here .


Puede agregar un miembro de clase como este NSString *changeTemp , luego

changetemp = textfield; if( change temp != textfild ){ changetemp=textfild; NSLog(@" text is changed" } else { NSLog(@" text isn''t changed"): }


Puede crear una variable para almacenar la cadena original y luego registrarse en el centro de notificaciones para recibir el evento UITextFieldTextDidChangeNotification :

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateButton:) name:UITextFieldTextDidChangeNotification object:nil];

Luego, cree un método para recibir la notificación y compare el valor actual del campo de texto con el valor original

-(void) updateButton:(NSNotification *)notification { self.myButton.enabled = ![self.myTextField.text isEqualToString:originalString]; }

No olvide cancelar el registro de la notificación cuando el controlador de vista se haya desasignado.

[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];


Swift 3.0

Proceso 1

Cree IBOutlet de UITextfiled y Agregar destino al campo de texto.

m_lblTxt.addTarget(self, action: #selector(self.textFieldDidChange), for: UIControlEvents.editingChanged) func textFieldDidChange(textField:UITextField) { NSLog(textField.text!) }

Proceso 2

m_lblTxt.delegate = self //MARK: - TextField Delegates func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { print(textField.text!) return true }