2008-12-23 9 views
103

Disons que j'ai le code suivant:Obtention de la valeur d'un objet UITextField en tapant une séquence de touches?

IBOutlet UITextField* nameTextField; 
IBOutlet UILabel* greetingLabel; 

Je voudrais le greetingLabel lire « Bonjour [nameTextField] » dès que l'utilisateur appuie sur une touche. Ce dont j'ai besoin fondamentalement est l'équivalent d'iPhone de la méthode de délégué de Cocoa controlTextDidChange.

La méthode de délégué textField:shouldChangeCharactersInRange: est appelé à chaque fois que se produit une séquence de touches:

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

L'argument de chaîne renvoie le caractère qui est pressée. La valeur réelle de textField (nameTextField.text) reste cependant vide.

Qu'est-ce qui me manque ici? (Je voudrais nameTextField pour refléter la chaîne exacte que l'utilisateur a entré jusqu'ici).

Répondre

189

Il se trouve, la meilleure façon de le faire est d'utiliser Interface Builder:

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

fonctionne comme un charme :) (je ne peux pas croire que je passé de nombreux jours à ce sujet, et de réaliser maintenant que la solution était beaucoup plus simple que ce que je pensais: P)

+2

Merci! J'avais utilisé "Value Changed" comme si vous utilisiez un UISlider, etc. Il était intéressant qu'ils aient deux événements qui semblent avoir le même comportement. – wjl

+5

C'est des trucs géniaux !! Merci d'avoir partagé votre solution. – Myxtic

+1

Pour une raison quelconque, je voulais toujours une manière programmatique de le faire ... 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. –

101

vous pouvez enregistrer une action pour les UIControlEventEditingChanges d'événements sur 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]; 

} 
+0

est-il un moyen spécifier cela en utilisant Interface Builder? – PlagueHammer

+0

Aha .. got it :) Détails dans ma réponse ci-dessous. – PlagueHammer

10

UITextField a une notification UITextFieldTextDidChange qui sera tiré à chaque fois que le texte change si vous vous inscrivez pour cela. 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 du UITextField.

Espérons que ça aide.

+0

Cela a sauvé la journée pour moi-merci! – mpemburn