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
:
#import <UIKit/UIKit.h> @interface UIResponder (firstResponderHack) + (UIResponder *)firstResponderByHack; @end
#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
) forceParamètres
Obliger
IndiquezYES
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 ouNO
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 surYES
, 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];