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ó. EltextField:shouldChangeCharacterInRange:replacementString:
delegate se llama antes de que se apliquen los cambios, por lo quetextField.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
}