ios cocoa-touch uitextfield uidatepicker

ios - UIControlEventEditingChanged no se activa cuando se utiliza setText de UITextfield



datepicker swift 4 (4)

Actualmente estoy tratando de rastrear los estados de un campo de texto.

Estoy usando un datePicker personalizado que establece el texto a través de -setText

[self.textField setText:[self.dateFormatter stringFromDate:self.date]];

Dentro de mi textFieldDelegate escribí el siguiente código:

-(void)viewDidLoad { [super viewDidLoad]; self.travelToOnTextField.delegate = self; [self.travelToOnTextField addTarget:self action:@selector(travelToOnTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; } -(void)travelToOnTextFieldDidChange:(id)sender { NSLog(@"Event Handler called"); }

Si cambio el texto a través de mi travelToOnDateTextFieldDidChange , no se llamará al método travelToOnDateTextFieldDidChange . Pero si cambio el texto usando el teclado de mi computadora, se llama por alguna razón.

¿Es esto intencional?


En Swift 2.2+, basado en la respuesta de @ Shaolo

  1. Conecte IBAction, preste atención a cambiar el tipo de evento predeterminado a EditingChanged

  1. Después de cambiar el texto de textField desde el código, agregue también sendActionsLine

    taskTextField.text = nil taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged)


La documentación dice:

UIControlEventEditingChanged A touch making an editing change in a UITextField objet. Available in iOS 2.0 and later. Declared in UIControl.h.

¿Tan solo tocar ?


Simplemente llame a sendActionsForControlEvents: después de configurar el texto:

self.textField.text = xxx; [self.textField sendActionsForControlEvents:UIControlEventEditingChanged];

Probado en iOS 9.


Tuve que calificar esta pregunta porque esto es muy importante.

Parece que esto ha cambiado en iOS6. Tal vez incluso iOS5. Este evento se usó como el método preferido para observar cambios de texto en un UITextField. Lo he estado usando desde iOS3. Después de volver a compilar mi aplicación en iOS6 para realizar algunas actualizaciones, misteriosamente dejó de funcionar. Partes de mi uso de la aplicación:

[UITextField insertText];

y otros usan

[UITextField setText];

o

UITextField.text = @"xxx";

Por el motivo que sea, es importante tener en cuenta que los eventos setText ya no activan el evento Editing Changed. Si utiliza un método insertText, todavía funciona.

Entonces, si está en un aprieto y solo necesita una solución rápida, puede cambiar su código de:

textField.text;

o

[textField setText:@"xxx"];

a

textField.text = @""; [textField insertText:@"new text"];

Esto también funciona:

[((UITextField*)view) sendActionsForControlEvents:UIControlEventEditingChanged];

Espero que esto ayude a alguien, porque desperdicié un día entero tratando de averiguar por qué este código dejó de funcionar repentinamente cuando subí a iOS6.

Todavía puedes usar NSNotificationCenter también. Vea la referencia de UITextField para más información:

https://developer.apple.com/documentation/uikit/uitextfield