UITextField "valor cambiado" no se activa cuando se actualiza el campo


Tengo un IBAction que he conectado a un elemento UITextField en Interface Builder. (Disparando en el evento "valor cambiado")

También tengo un UISlider que actualiza el elemento TextField automáticamente cuando su valor se ajusta.

Cuando corro mi aplicación, el campo de texto se actualiza cuando ajuste el control deslizante, pero el evento "valor cambiado" no se activa cuando esto sucede. El evento value changed tampoco se activa cuando edito el campo de texto a mano. (Aunque usando el Did Editar End trigger hace que se dispare).

Mi pregunta es, ¿cómo puedo obtener el valor cambiado disparador para disparar tanto para una actualización programática del campo de texto, así como cuando el usuario ajusta el valor.

Author: Andrew Lauer Barinov, 2011-11-22

6 answers

Como sugiere TheRonin, use UITextFieldDelegate e implemente el siguiente método

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 5
Author: Ilanchezhian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-22 09:14:42

No use UIControlEventValueChanged para UITextField. Lo que quieres es UIControlEventEditingChanged.

 175
Author: Mark Adams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-22 09:21:58

Para obtener EditingChanged textfield event, sugerí agregar selector como

[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];

A medida que cambia el valor de textfield, el valor cambiado obtendrá de este selector textChanged:.

-(void)textChanged:(UITextField *)textField
{
    NSLog(@"textfield data %@ ",textField.text);
}
 66
Author: iKT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-11 07:02:11

SI está asignando un delegado al campo de texto, tenga en cuenta que (cuando devuelve NO del método delegado a continuación, el evento (Edición modificada) no se activará. Considere invocar el receptor de eventos cuando devuelva NO de este método

(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 11
Author: Nech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-02 17:18:56

Una vieja pregunta, pero el primer resultado de búsqueda que encontré, y ninguna de las respuestas son satisfactorias. Encontré que esta solución funciona mejor: Swift UITextField subclase manejar el cambio de texto mediante programación.

Invalida la propiedad text de UITextField para agregar una didSet(), y llama a tu función value changed desde allí.

  override open var text: String? {
        didSet {
            myValueDidChange()
        }
    }
 2
Author: robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-23 23:35:37

Para Swift 3:

textField.addTarget(self, action: #selector(textChanged), for: .valueChanged)

func textChanged() { 
 .... 
}
 -3
Author: UnRewa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-06 12:43:56