Je voudrais pouvoir détecter si du texte est modifié dans un UITextField
afin de pouvoir ensuite activer un UIButton
pour enregistrer les modifications.
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
}
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:
NSNotificationCenter
.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.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 .
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
}
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.
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];