Obtenir la valeur d'un UITextField lors de la saisie de touches?

107

Disons que j'ai le code suivant:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

Je voudrais greetingLabellire "Hello [nameTextField]" dès que l'utilisateur appuie sur une touche.

Ce dont j'ai besoin, c'est l'équivalent iPhone de la méthode déléguée Cocoa controlTextDidChange.

La textField:shouldChangeCharactersInRange:méthode déléguée est appelée à chaque fois qu'une frappe se produit:

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

L'argument chaîne renvoie le caractère appuyé. La textFieldvaleur réelle ( nameTextField.text) reste cependant vide.

Qu'est-ce que j'oublie ici? (Je voudrais nameTextFieldrefléter la chaîne exacte que l'utilisateur a entrée jusqu'à présent).

PesteMarteau
la source

Réponses:

197

Il s'avère que le moyen le plus simple de le faire est d'utiliser Interface Builder:

  • Ajouter une IBAction (au ViewController, par exemple, comme dans ce cas)
  • Ctrl-clic (ou clic droit) sur UITextField dans Interface Builder
  • Connectez l'événement "Modification modifiée" à l'IBAction du propriétaire du fichier ajoutée à la première étape.

Fonctionne comme un charme :) (Je ne peux pas croire que j'ai passé de nombreux jours là-dessus, et de me rendre compte maintenant que la solution était beaucoup plus simple que je ne le pensais: P)

PesteMarteau
la source
2
Merci! J'avais utilisé "Value Changed" comme vous l'utiliseriez avec un UISlider, etc. Intéressant qu'ils aient deux événements qui semblent avoir le même comportement.
wjl
1
Pour une raison quelconque, je voulais toujours une manière programmatique de faire cela ... mais j'ai cédé ... Cette méthode Rocks! Merci pour le partage ... Je l'avais vu avant mais après des jours de codage mon cerveau ne fonctionne plus hehe.
Albert Renshaw
8
@AlbertRenshaw Mais vous pouvez le faire de manière programmatique;) Effectuez simplement [textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];).
Vive
101

vous pouvez enregistrer une action pour l'événement UIControlEventEditingChanges dans le champ de texte:

[nameTextField addTarget:self action:@selector(updateLabelUsingContentsOfTextField:) forControlEvents:UIControlEventEditingChanged];

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

    greetingLabel.text = [NSString stringWithFormat:@"Hello %@", ((UITextField *)sender).text];

}

la source
Existe-t-il un moyen de spécifier cela à l'aide d'Interface Builder?
PlagueHammer
11

UITextFielda une notification UITextFieldTextDidChangequi sera déclenchée chaque fois que le texte change si vous vous y inscrivez. Inscrivez-vous simplement pour cette notification et dans la méthode appelée par la notification, modifiez le texte de l'étiquette.

Pour ajouter à cela, l'objet passé à votre gestionnaire de notifications aura le texte du UITextField.

J'espère que cela pourra aider.

perdu
la source