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).
Il s'avère que la façon la plus simple de le faire est d'utiliser Interface Builder:
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)
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];
}
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é.