web-dev-qa-db-fra.com

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

Disons que j'ai le code suivant:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

J'aimerais que greetingLabel lise "Bonjour [nameTextField]" dès que l'utilisateur appuie sur une touche.

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

Le textField:shouldChangeCharactersInRange: la 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 sur lequel vous appuyez. La valeur réelle de textField (nameTextField.text) reste cependant vide.

Qu'est-ce que j'oublie ici? (J'aimerais que nameTextField reflète la chaîne exacte que l'utilisateur a entrée jusqu'à présent).

107
PlagueHammer

Il s'avère que la façon la plus simple de le faire est d'utiliser Interface Builder:

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

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

195
PlagueHammer

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];

}
101
Ax

UITextField a une notification UITextFieldTextDidChange qui sera déclenchée chaque fois que le texte change si vous vous y inscrivez. Enregistrez-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 transmis à votre gestionnaire de notification aura le texte de UITextField.

J'espère que ça t'as aidé.

10
lostInTransit