web-dev-qa-db-fra.com

UIControlEventEditingChanged ne se déclenche pas lors de l'utilisation de setText de UITextfield

J'essaie actuellement de suivre les états d'un champ de texte.

J'utilise un datePicker personnalisé qui définit le texte via -setText

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

Dans mon textFieldDelegate j'ai écrit le code suivant:

-(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 je modifie le texte via mon Datepicker personnalisé, la méthode travelToOnDateTextFieldDidChange n'est pas appelée. Mais si je modifie le texte à l'aide de mon clavier d'ordinateur, il est appelé pour une raison quelconque.

Est-ce intentionnel?

49
Sebastian Boldt

J'ai dû évaluer cette question parce que c'est super important.

Il semble que cela ait changé dans iOS6. Peut-être même iOS5. Cet événement [~ # ~] a utilisé [~ # ~] pour être la méthode préférée pour observer les changements de texte dans un UITextField. Je l'utilise depuis iOS3. Après avoir recompilé mon application sur iOS6 pour effectuer certaines mises à jour, elle a mystérieusement cessé de fonctionner. Parties de mon application:

[UITextField insertText];

et d'autres utilisent

[UITextField setText];

ou

UITextField.text = @"xxx";

Pour une raison quelconque, il est important de noter que setText les événements ne déclenchent plus l'événement Editing Changed. Si vous utilisez une méthode insertText, elle fonctionne toujours.

Donc, si vous êtes dans une impasse et que vous avez juste besoin d'une solution rapide, vous pouvez modifier votre code à partir de:

textField.text;

ou

[textField setText:@"xxx"];

à

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

Cela fonctionne également:

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

J'espère que cela aide quelqu'un, car j'ai perdu une journée entière à essayer de comprendre pourquoi ce code a soudainement cessé de fonctionner lorsque je suis passé à iOS6.

Vous pouvez également utiliser NSNotificationCenter. Voir la référence UITextField pour plus d'informations:

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

80
Shaolo

Il suffit d'appeler sendActionsForControlEvents: après avoir défini le texte:

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

Testé sur iOS 9.

17
Gon

Dans Swift 2.2+, basé sur la réponse de @ Shaolo

  1. Connectez IBAction, faites attention à changer le type d'événement par défaut en EditingChanged

enter image description here

  1. Après avoir modifié le texte de textField à partir du code, ajoutez également sendActionsLine

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

La documentation dit:

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

Alors toucher seulement?

4
Charlie Price

Mise à jour: Swift 4.2

textField.text = "some Text"
textField.sendActions(for: UIControl.Event.editingChanged)
2
gayashanbc