J'ai un IBAction
que j'ai connecté à un élément UITextField
dans Interface Builder. (Tir sur événement "valeur modifiée")
J'ai également un UISlider
qui met à jour automatiquement l'élément TextField lorsque sa valeur est ajustée.
Lorsque j'exécute mon application, le TextField est mis à jour lorsque j'ajuste le curseur, mais l'événement "valeur modifiée" ne se déclenche pas lorsque cela se produit. L'événement de valeur modifiée ne se déclenche pas non plus lorsque je modifie le TextField à la main également. (Bien que l'utilisation du déclencheur Did Editing End le fasse se déclencher).
Ma question est, comment puis-je obtenir le déclencheur de la valeur modifiée pour se déclencher à la fois pour une mise à jour programmatique de TextField et lorsque l'utilisateur ajuste la valeur.
Comme suggéré par TheRonin, utilisez UITextFieldDelegate
et implémentez la méthode suivante
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
N'utilisez pas UIControlEventValueChanged
pour UITextField
. Ce que vous voulez, c'est UIControlEventEditingChanged
.
Obtenir EditingChanged textfield event
, J'ai suggéré d'ajouter un sélecteur comme
[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
Comme la valeur du champ de texte a changé, la valeur modifiée que vous obtiendrez de ce textChanged:
sélecteur.
-(void)textChanged:(UITextField *)textField
{
NSLog(@"textfield data %@ ",textField.text);
}
SI vous affectez un délégué au champ de texte, notez que (lorsque vous retournez NO à partir de la méthode déléguée ci-dessous, l'événement (Modification modifiée) ne sera pas déclenché. Pensez à appeler l'écouteur d'événements lorsque vous renvoyez NO à partir de cette méthode.
(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
Une vieille question, mais le premier résultat de recherche que j'ai trouvé, et aucune des réponses n'est satisfaisante. J'ai trouvé que cette solution fonctionnait le mieux: la sous-classe Swift UITextField gère le changement de texte par programme .
Substituez la propriété text de UITextField pour ajouter un didSet (), et appelez votre fonction de valeur modifiée à partir de là.
override open var text: String? {
didSet {
myValueDidChange()
}
}
Swift 4:
class YourViewController: UIViewController {
// MARK: Outlets
@IBOutlet weak var titleTextField: UITextField!
// MARK: View lifecycle
override func viewDidLoad() {
super.viewDidLoad()
titleTextField.delegate = self
}
}
// MARK: UITextFieldDelegate methods
extension YourViewController: UITextFieldDelegate {
func textField(_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
print("changed")
return true
}
}
Alors que la valeur est affectée par programme, dans ce cas, textFieldDidChange n'est jamais appelé car en fait textField n'a pas changé. Pour cet événement externe doit passer
par exemple., textfield.sendActions (pour: .editingChanged) cela déclenchera l'événement de modification modifié et textFieldDidChange sera appelé même après que la valeur a été modifiée par programme.
Où appliquer cet événement :
Après avoir attribué une valeur au texte déposé, par exemple., textfield.text = "some value"