web-dev-qa-db-fra.com

UITextField "valeur modifiée" ne se déclenche pas lorsque le champ est mis à jour

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.

68

Comme suggéré par TheRonin, utilisez UITextFieldDelegate et implémentez la méthode suivante

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
3
Ilanchezhian

N'utilisez pas UIControlEventValueChanged pour UITextField. Ce que vous voulez, c'est UIControlEventEditingChanged.

204
Mark Adams

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);
}
70
iKT

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
11
Nech

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()
        }
    }
2
robert

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
    }
}
0
balazs630

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"

0
Akshaykumar Digrase