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?
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:
Il suffit d'appeler sendActionsForControlEvents:
après avoir défini le texte:
self.textField.text = xxx;
[self.textField sendActionsForControlEvents:UIControlEventEditingChanged];
Testé sur iOS 9.
Dans Swift 2.2+, basé sur la réponse de @ Shaolo
EditingChanged
Après avoir modifié le texte de textField à partir du code, ajoutez également sendActionsLine
taskTextField.text = nil
taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged)
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?
Mise à jour: Swift 4.2
textField.text = "some Text"
textField.sendActions(for: UIControl.Event.editingChanged)