Comment puis-je supprimer le keyboard par programmation?

J'ai besoin d'un moyen de déterminer le UITextField qui est actuellement sélectionné dans une vue. Est-ce possible sans passer une reference ou un tag?

Pour être plus précis, je dois être capable de dire quel UITextField est sélectionné afin que je puisse cacher le keyboard. La raison pour laquelle j'ai besoin de cela est parce que je veux créer un UIToolbar à append à tous les UITextField comme un accessoire de saisie. Sur cet UIToolbar j'appendai un button 'Terminé', quand on appuie UITextField cela devrait cacher le keyboard pour l' UITextField actuellement sélectionné.

Il existe une méthode de délégué:

 - (void)textFieldDidBeginEditing:(UITextField *)textField 

Apple Docs:

Cette méthode indique au délégué que le champ de text spécifié est devenu le premier répondeur. Vous pouvez utiliser cette méthode pour mettre à jour les informations d'état de votre délégué. Par exemple, vous pouvez utiliser cette méthode pour afficher les vues de superposition qui doivent être visibles lors de la modification.

Il y a aussi une propriété:

 @property(nonatomic, readonly, getter=isEditing) BOOL editing 

Apple Docs:

Une valeur booleanne indiquant si le champ de text est actuellement en mode édition. (lecture seulement)

Je suppose que vous voulez dire que vous voulez savoir quel UITextField est le premier répondeur (qui est le champ de text qui reçoit l'input du keyboard).

Il n'y a pas d'API publique pour cela (bien qu'il existe une API privée). Vous pouvez suivre manuellement le champ de text du premier répondeur en utilisant la méthode textFieldDidBeginEditing: du délégué de chaque champ de text, ou vous pouvez utiliser un peu de supercherie pour find le premier répondeur à tout moment.

Voici l'astuce. L'object UIApplication sait quel object est le premier répondeur et peut lui envoyer un message. Donc, vous écrivez une catégorie comme celle-ci sur UIResponder :

UIResponder + firstResponderHack.h

 #import <UIKit/UIKit.h> @interface UIResponder (firstResponderHack) + (UIResponder *)firstResponderByHack; @end 

UIResponder + firstResponderHack.m

 #import "UIResponder+firstResponderHack.h" @interface FirstResponderFinder : NSObject @property (strong, nonatomic) UIResponder *firstResponder; @end @implementation FirstResponderFinder @synthesize firstResponder = _firstResponder; @end @implementation UIResponder (firstResponderHack) - (void)putFirstResponderIntoFinder:(FirstResponderFinder *)finder { if (self.isFirstResponder) finder.firstResponder = self; } + (UIResponder *)firstResponderByHack { FirstResponderFinder *finder = [FirstResponderFinder new]; // Sending an action to nil sends it to the first responder. [[UIApplication sharedApplication] sendAction:@selector(putFirstResponderIntoFinder:) to:nil from:finder forEvent:nil]; return finder.firstResponder; } @end 

Ensuite, vous pouvez find le premier répondeur, et vérifier s'il s'agit d'un UITextField , comme ceci:

 UIResponder *firstResponder = [UIResponder firstResponderByHack]; if (firstResponder && [firstResponder isKindOfClass:[UITextField class]]) { UITextField *textField = (UITextField *)firstResponder; // do something with textField } 

Il existe un moyen facile de fermer le keyboard sans avoir à suivre le contrôle actuellement actif , ou itérer à travers tous les controls disponibles, ou en utilisant un UITextFieldDelegate .

 [self.view endEditing:YES] 

De la docs:

endEditing:

Provoque l'abandon de l'état du premier répondeur par l'affichage (ou l'un de ses champs de text incorporés).

– ( BOOL ) endEditing: ( BOOL ) force

Paramètres
Obliger
Indiquez YES pour forcer le premier répondeur à démissionner, qu'il souhaite ou non le faire.

Valeur de return
YES si la vue a démissionné du statut de premier répondeur ou NO si ce n'est pas le cas.

Discussion
Cette méthode examine la vue actuelle et sa hiérarchie de sous-vues pour le champ de text qui est actuellement le premier répondeur. S'il en trouve un, il request à ce champ de text de démissionner en tant que premier répondant. Si le paramètre force est défini sur YES , le champ de text n'est jamais demandé; il est forcé de démissionner.

Créez simplement un ivar pour UITextView dans votre file d'en-tête:

 UITextField *editingField; @property (nonatomic, copy) UITextField *editingField; 

Alors,

 - (void)textFieldDidBeginEditing:(UITextField *)textField; { editingField = textField; // Whatever else you want to do } 

Je pense que vous devez différencier textFields sans reference. Ainsi, le pourquoi recommandé utilise l' exécution de ObjectiveC .
C'est plutôt simple. D'abord:

  #import <objc/runtime.h> 

Ensuite, définissez un caractère pour son adresse:

  static char UITextFieldViewIdentifier; 

Ensuite, définissez l'identifiant avec quelque chose comme ceci:

  objc_setValue(textField, &UITextFieldViewIdentifier, @"Identifier") //typing on a phone, not so sure about the expression 

Dans la méthode du délégué:

  NSSsortingng *identifier = objc_getObject(textField, &UITextFieldViewIdentifier) 

Appelez simplement cette ligne où vous voulez fermer le keyboard:

 [self.view endEditing:YES];