189 votes

Comment supprimer le clavier lors de l'édition d'un champ UITextField ?

Je sais que je dois indiquer à mon UITextField de renvoyer le premier intervenant lorsque je veux désactiver le clavier, mais je ne sais pas comment savoir si l'utilisateur a appuyé sur la touche "Done" du clavier. Existe-t-il une notification que je peux surveiller ?

2 votes

[self.view endEditing:YES] ; en touches commence le délégué est la meilleure solution

355voto

kubi Points 20607

Je définis le délégué du UITextField à mon ViewController classe.

Dans ce cours, j'ai mis en œuvre cette méthode de la manière suivante :

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

0 votes

Voyez l'exemple ci-dessus... connectez l'utilisation d'IntefaceBuilder à l'action du contrôleur que vous utilisez... chaque fois que l'utilisateur fermera le système de saisie de texte (en appuyant sur "done"), cette action sera invoquée...

2 votes

L'un ou l'autre fonctionnera - le champ de texte envoie son action lorsque l'utilisateur appuie sur la touche Return ("Done", peu importe), et envoie également son délégué -textFieldShouldReturn :.

0 votes

BTW - cela fonctionne également pour une UISearchBar. Par exemple, dans mon code, j'avais un membre IBOutlet searchBarTusb ; Lorsque ma "clé de retour" (UIReturnKeySearch) a été cliquée, -(void) searchBarSearchButtonClicked :, j'ai mis la déclaration [searchBarTusb resignFirstResponder] ; Notez également que la "clé de retour" a été définie dans la NIB à l'aide d'Interface Builder.

48voto

Jason Coco Points 52303

Si vous reliez l'événement DidEndOnExit du champ de texte à une action (IBAction) dans InterfaceBuilder, un message sera envoyé lorsque l'utilisateur quittera le clavier (avec la touche retour) et l'expéditeur sera une référence à l'UITextField qui a déclenché l'événement.

Par exemple :

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

Ensuite, dans InterfaceBuilder, liez l'événement DidEndOnExit du champ de texte à cette action sur votre contrôleur (ou tout autre élément que vous utilisez pour lier les événements de l'interface utilisateur). Chaque fois que l'utilisateur saisit du texte et ferme le champ de texte, le contrôleur recevra ce message.

0 votes

Le seul événement qui semble pouvoir fonctionner est textFieldDidEndEditing, qui indique qu'il n'est envoyé qu'après que l'UITextField a renoncé à son statut de premier répondant. Comment puis-je savoir quand je dois renoncer au statut de premier intervenant ?

0 votes

Je suis désolé pour la terminologie... il ne s'agit pas d'une notification réelle (événement)... Je vais éditer ma réponse avec un exemple et une explication rapide, donc à voir :)

1 votes

Pour clarifier cette réponse, le textField envoie l'événement "Did End On Exit" lorsque vous appuyez sur la touche retour, c'est donc cet événement que vous devez lier à votre contrôleur. Je pense que cette méthode est plus facile que celle que j'ai décrite ci-dessus.

33voto

Hugo Points 251

Vous pouvez également créer une méthode dans votre contrôleur

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

puis, dans l'inspecteur de connexion de l'IB, connectez-y l'événement "Did End On Exit".

1 votes

C'est presque faux, ou du moins cela ne correspond pas à la réalité. En souscrivant à la DidEndOnExit il n'est pas nécessaire d'appeler resignFirstResponder . Vous pouvez tester cela en plaçant un point d'arrêt symbolique sur [UIResponder resignFirstResponder] . Notez que même si vous n'appelez pas resignFirstResponder, le système l'appellera quand même. Ceci est expliqué dans l'excellent livre de Matt Neuburg : apeth.com/iOSBook/

20voto

Kubi, merci. Votre code a fonctionné. Juste pour être explicite (pour les nouveaux comme) comme vous le dites, vous devez définir le paramètre UITextField 's delegate pour qu'il soit égal au ViewController dans lequel se trouve le champ de texte. Vous pouvez faire cela où vous voulez. J'ai choisi le viewDidLoad méthode.

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}

19voto

matt Points 60113

Voici une astuce pour obtenir un comportement automatique de rejet du clavier sans aucun code. Dans la nib, modifiez l'objet proxy First Responder dans l'inspecteur d'identité, en ajoutant une nouvelle action first responder ; appelons-la dummy: . Accrochez maintenant l'événement Did End on Exit du champ de texte à l'événement dummy: de l'objet proxy First Responder. Le tour est joué ! Puisque l'événement Did End on Exit du champ de texte possède maintenant une paire action-cible, le champ de texte ferme automatiquement son clavier lorsque l'utilisateur appuie sur Return ; et puisqu'il n'y a pas de pénalité pour ne pas trouver de gestionnaire pour un message envoyé dans la chaîne de réponse, l'application ne se plante pas même s'il n'y a pas d'implémentation de l'objet proxy First Responder. dummy: n'importe où.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X