web-dev-qa-db-fra.com

Détection d'une modification de texte dans UITextfield

Je voudrais pouvoir détecter si du texte est modifié dans un UITextField afin de pouvoir ensuite activer un UIButton pour enregistrer les modifications.

21
RGriffiths

Profitez de la notification UITextFieldTextDidChange ou définissez un délégué sur le champ de texte et surveillez textField:shouldChangeCharactersInRange:replacementString.

Si vous souhaitez surveiller les modifications avec une notification, vous aurez besoin de quelque chose comme ceci dans votre code pour vous inscrire au notification:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:theTextField];

Ici, theTextField est l'instance de UITextField que vous souhaitez regarder. La classe dont self est une instance dans le code ci-dessus doit alors implémenter textFieldDidChange, comme ceci:

- (void)textFieldDidChange:(NSNotification *)notification {
    // Do whatever you like to respond to text changes here.
}

Si le champ de texte va survivre à la observer, vous devez alors désenregistrer pour les notifications dans la méthode dealloc de l'observateur. En fait, c'est une bonne idée de le faire même si le champ de texte ne survit pas à l'observateur.

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    // Other dealloc work
}
34
Aaron Golden

Au lieu d'observer les notifications ou de mettre en œuvre textField:shouldChangeCharacterInRange:replacementString:, il est plus simple d'ajouter simplement une cible d'événement:

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

- (void)myTextFieldDidChange:(id)sender {
    // Handle change.
}

Notez que l'événement est UIControlEventEditingChanged et pasUIControlEventValueChanged!

Les avantages par rapport aux deux autres solutions suggérées sont:

  • Vous n'avez pas besoin de vous souvenir de désinscrire votre contrôleur avec le NSNotificationCenter.
  • Le gestionnaire d'événements est appelé après la modification a été effectuée, ce qui signifie textField.text contient le texte que l'utilisateur a entré. Le textField:shouldChangeCharacterInRange:replacementString: la méthode déléguée est appelée avant que les modifications aient été appliquées, donc textField.text ne vous donne pas encore le texte que l'utilisateur vient de saisir - vous devez d'abord appliquer le changement vous-même.
40
DarkDust

Pour cela, vous devez d'abord avoir votre champ de texte auquel il a assigné la référence de délégué. Et le delgate, devrait de préférence être, le contrôleur vew qui est le propriétaire des fichiers de la vue. Qui va comme

myTextField.delegate = myViewControllerReferenceVariable

Et dans votre interface viewController, dites que vous implémenterez UITextFieldDelegate en

@interface MyViewController:UIViewController<UITextFieldDelegate>

Et dans votre vue de mise en œuvre du contrôleur de remplacement

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

Donc, le code ressemblera

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
     {
        text = [textfield.text stringByReplacingCharactersInRange:range withString:string];
        if (textfield == refToTextFieldYouWantToCheck) {
            if ( ! [textToCheck isEqualToString:text] ) {
               [theButtonRef setEnabled:YES];
            } 
         }
           return YES; //If you don't your textfield won't get any text in it
      }

Vous pouvez également vous abonner à la notification qui est en quelque sorte désordonnée à mon humble avis. Vous pouvez trouver comment le faire ici .

9
Jesly Varghese

Swift 3.0

Processus 1

Créez IBOutlet de UITextfiled et ajoutez la cible au champ de texte.

 m_lblTxt.addTarget(self, action: #selector(self.textFieldDidChange), for: UIControlEvents.editingChanged)

 func textFieldDidChange(textField:UITextField)
 {
     NSLog(textField.text!)
 }

Processus 2

 m_lblTxt.delegate = self

 //MARK: - TextField Delegates
 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
 {
      print(textField.text!)
      return true
 }
2
Sunny

Cela peut être accompli dans Interface Builder sur l'événement Editing Changed De UITextField. Faites-le glisser vers votre code et créez un IBAction.

Par exemple:

@IBAction func textFieldChanged(_ sender: UITextField) {
  print(sender.text)
}

Cet événement est le même que celui décrit dans les autres réponses ici en ce que la propriété .text Contient l'entrée de texte mise à jour lorsqu'elle est déclenchée. Cela peut aider à nettoyer l'encombrement du code en évitant d'ajouter par programmation l'événement à chaque UITextField de la vue.

1
Mark Suman

Vous pouvez créer une variable pour stocker la chaîne d'origine, puis vous inscrire auprès du centre de notification pour recevoir l'événement UITextFieldTextDidChangeNotification:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateButton:) name:UITextFieldTextDidChangeNotification object:nil];

Ensuite, créez une méthode pour recevoir la notification et comparez la valeur actuelle du champ de texte avec la valeur d'origine

-(void) updateButton:(NSNotification *)notification {
       self.myButton.enabled = ![self.myTextField.text isEqualToString:originalString];
}

N'oubliez pas de désenregistrer la notification lorsque le contrôleur de vue est désalloué.

[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];
1
Firas