2010-05-13 6 views
48

Ceci est probablement une question stupide, mais je ne trouve pas la réponse dans les documents. Le bouton "Terminé" du clavier contextuel a-t-il toujours fait disparaître le clavier? Je vois beaucoup de code autour du web comme celui-ci:Clavier de l'iPhone, bouton Terminé et resignFirstResponder

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
    [theTextField resignFirstResponder]; 
    return YES; 
} 

Lorsque j'appuie sur le bouton « Terminé », le clavier pops vers le bas et le premier intervenant UITextField démissionne.

Je suppose que le fait d'appuyer sur le bouton "Terminé" n'a pas causé UITextField à resignFirstResponder, mais ce comportement a changé à un moment donné.

Je suis débogage sur OS 3.0 - 3.1.3

+1

Voir https://developer.apple.com/library/ios/#documentation/iphone/conceptual/iPhone101/Articles/05_ConfiguringView.html –

+1

Apparemment, je ne » J'ai suffisamment de rep pour ajouter juste un commentaire à la réponse de Nevan King, donc je vais mentionner ici que pour sa solution il n'est pas nécessaire de faire de la classe un UITextFieldDelegate. Le protocole UITextFieldDelegate définit simplement certains messages envoyés au délégué demandant si le champ de texte doit démissionner, s'il a démissionné, etc ... Tout objet peut recevoir des actions de la manière dont sa réponse a été implémentée simplement en définissant sa méthode comme il l'a fait avec textFieldFinished. –

Répondre

89

J'ai fait un petit projet de test avec juste un UITextField et ce code

#import <UIKit/UIKit.h> 
@interface TextFieldTestViewController : UIViewController 
<UITextFieldDelegate> 
{ 
    UITextField *textField; 
} 
@property (nonatomic, retain) IBOutlet UITextField *textField; 
@end 

#import "TextFieldTestViewController.h" 
@implementation TextFieldTestViewController 
@synthesize textField; 

- (void)viewDidLoad 
{ 
    [self.textField setDelegate:self]; 
    [self.textField setReturnKeyType:UIReturnKeyDone]; 
    [self.textField addTarget:self 
        action:@selector(textFieldFinished:) 
     forControlEvents:UIControlEventEditingDidEndOnExit]; 
    [super viewDidLoad]; 
} 
- (IBAction)textFieldFinished:(id)sender 
{ 
    // [sender resignFirstResponder]; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 
@end 

Le champ de texte est un UITextField non modifié traîné sur le NIB, avec la sortie connecté.
Après avoir chargé l'application, cliquez sur le champ de texte pour afficher le clavier. En appuyant sur le bouton "Terminé", le champ de texte perd le focus et anime le clavier. Notez que le conseil sur le web est de toujours utiliser [sender resignFirstResponder] mais cela fonctionne sans cela.

+0

Hmm. Et qu'est-ce que addTarget: action: forControlEvents: for? N'est-ce pas setDelegate: assez? Laissez-moi essayer par moi-même. – bealex

+0

Oui, exactement. Si vous supprimez addTarget: ... call, tout va bien. – bealex

+1

Pour les noobs comme moi, la façon de faire avec interface builder est de faire glisser le + de "Did End On Exit" vers le propriétaire du fichier, puis l'assigner à un IBAction qui ne fait rien (textFieldFinished: (id) expéditeur dans ce Exemple). La réponse ci-dessus est correcte, je voulais juste ajouter à cela. –

6

De la documentation (toute version):

Il est la responsabilité de l'application de rejeter le clavier au moment de votre choix . Vous pouvez ignorer le clavier en réponse à une action utilisateur spécifique, tels que l'utilisateur en appuyant sur un bouton particulier dans votre interface utilisateur. Vous pouvez également configurer votre délégué de champ de texte à en ignorant le clavier lorsque l'utilisateur appuie sur la touche "retour" du clavier lui-même. Pour ignorer le clavier , envoyez le message resignFirstResponder au champ de texte qui est actuellement le premier répondeur . Cela entraîne l'objet de champ pour mettre fin à la session d'édition en cours (avec le consentement de l'objet ) et masquer le clavier .

Donc, vous devez envoyer un message à resignFirstResponder. Mais il existe une possibilité que textfield perd son focus lors du traitement de textFieldShouldReturn: message. Cela entraînera également la disparition du clavier.

+0

Merci pour la réponse. J'ai trouvé la partie qui provoque la 'UITextField' à démissionner premier répondeur. J'ai un appel '\t [textField addTarget: action de soi: @selector (textFieldDone :) forControlEvents: UIControlEventEditingDidEndOnExit]'. Curieusement, la méthode 'textFieldDone:' est vide (j'ai supprimé l'appel 'resignFirstResponder'). Donc, je n'arrive toujours pas à comprendre pourquoi le clavier disparaît. –

+0

Peut-être que vous déplacez le focus vers un autre composant implicitement? En changeant une valeur dans une table ou une étiquette par exemple? – bealex

+0

Je ne pense pas qu'il y ait autre chose. J'ai créé un petit projet (posté le code ci-dessous) et il donne le même comportement. Pas vraiment sûr pourquoi ça se passe. –

2

Un code de ligne pour le bouton Terminé: -

[yourTextField setReturnKeyType:UIReturnKeyDone]; 

Et ajouter une méthode d'action sur valueChanged de TextField et ajoutez cette ligne-

[yourTextField resignFirstResponder]; 
13

Dans Xcode 5.1

Activer le bouton Terminé

  • Dans Attributs Inspecteur pour la UITextField dans Storyboard trouver le champ "Retour Key" et sélectionnez "Terminé"

Masquer le clavier lorsque vous avez terminé est pressé

  • Dans Storyboard, faites de votre ViewController le délégué de UITextField
  • Ajouter cette méthode à votre ViewController

    -(BOOL)textFieldShouldReturn:(UITextField *)textField 
    { 
        [textField resignFirstResponder]; 
        return YES; 
    } 
    
Questions connexes