vous trouverez ci-dessous mes fichiers .h & .m pour mon contrôleur de vue principal.
J'ai 3 questions.
1.) Parce que j'ai plusieurs uitextfields, dois-je définir chacun avec sa propre déclaration resignFirstResponder? et 2.) Où ferais-je cela, avec quelle méthode? 3.) Est-ce que ma syntaxe est correcte pour démissionner du premier répondant?
En outre, ce serait vraiment bien si je pouvais fermer le clavier lorsque l'utilisateur clique hors du champ, PAS en appuyant sur la touche Retour!
Je sais que cela a déjà été demandé et obtenu une réponse, mais pour être honnête avec vous, je suis encore un peu confus quant à ce qui se passe où.
J'utilise des storyboards, avec XCode 5 et iOS 7.
=============================
fichier .h
@interface ViewController : UIViewController <UITextFieldDelegate,UITableViewDelegate,UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITextField *danceDate;
@property (weak, nonatomic) IBOutlet UITextField *dancePlace;
@property (weak, nonatomic) IBOutlet UITextField *danceTerminal;
@property (weak, nonatomic) IBOutlet UITextField *danceGate;
fichier .m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self retrieveFromParse];
self.tableView.dataSource = self;
self.tableView.delegate = self;
self.navigationItem.rightBarButtonItem = self.editButtonItem;
// SET DELEGATE HERE
//
// if I uncomment 1 of these lines, i'll get an error.
//
// _dancePlace.delegate = self;
// dancePlace.delegate = self;
// dancePlace = self;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
}
-(BOOL) textFieldShouldReturn: (UITextField *) textField
{
[textField resignFirstResponder];
return YES;
}
-(BOOL) textFieldShouldReturn: (UITextField *) textField
{
return YES;
}
Démission de l'objet textField: Tous vos textField.delegate doivent être définis en tant qu'objet de ViewController. Et implémentez ensuite la méthode déléguée ci-dessous.
-(BOOL) textFieldShouldReturn: (UITextField *) textField {
[textField resignFirstResponder];
return YES;
}
Pour fermer le clavier sur le robinet de la vue: Ajoutez un geste Tap dans votre vue ViewController.view comme suit:
//declare a property to store your current responder
@property (nonatomic, assign) id currentResponder;
//in viewDidLoad:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(resignOnTap:)];
[singleTap setNumberOfTapsRequired:1];
[singleTap setNumberOfTouchesRequired:1];
[self.view addGestureRecognizer:singleTap];
[singleTap release];
//Implement the below delegate method:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
self.currentResponder = textField;
}
//Implement resignOnTap:
- (void)resignOnTap:(id)iSender {
[self.currentResponder resignFirstResponder];
}
// was missing ; after the call --> [self.currentResponder resignFirstResponder]
// also in textFieldDidEndEditing set self.currentResponder = nil;
Essayez ce qui suit:
[[self view] endEditing:YES]
-(BOOL) textFieldShouldReturn: (UITextField *) textField{
[textField resignFirstResponder];
return YES;
}
connectez également votre UITextField
Delegate .
Voici ce que j'utilise dans mon code. Cela fonctionne très bien et est plus efficace que les autres réponses.
Dans yourviewcontroller.h, ajoutez:
@property (nonatomic) UITapGestureRecognizer *tapRecognizer;
Maintenant, dans le fichier .m, ajoutez ceci à votre fonction ViewDidLoad:
- (void)viewDidLoad {
//Keyboard stuff
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)];
tapRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapRecognizer];
}
Ajoutez également cette fonction dans le fichier .m:
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
Cette réponse fonctionne pour iOS 7 et arc,
fermer le clavier lorsque l'utilisateur touche retour: dans ViewController, ajoutez l'action suivante
-(IBAction)textFieldReturn:(id)sender { [sender resignFirstResponder]; }
ensuite, dans main.storyboard, sélectionnez textField et à partir de l'inspecteur de connexions , faites glisser l'événement "Did End On Exit" vers le contrôleur de vue.
fermer le clavier lorsque l'utilisateur touche l'arrière-plan: implémente la méthode suivante dans ViewController
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; if ([YOUR_TEXT_FIELD isFirstResponder] && [touch view] != YOUR_TEXT_FIELD) { [YOUR_TEXT_FIELD resignFirstResponder]; } [super touchesBegan:touches withEvent:event]; }
Lorsque UITextField
en question appelle la méthode déléguée de - (BOOL)textFieldShouldReturn:(UITextField*)textField
, il se passe lui-même en tant qu'argument.
Donc, la textField
spécifique disponible comme argument de cette méthode IS celle spécifique qui vous tient à coeur. Dans cette méthode déléguée, vous pouvez simplement vous y référer en tant que "textField".
Cela signifie que vous devez utiliser ce que Mirko Catalano a conseillé d'appeler resignFirstResponder
sur textField
plutôt que sur les propriétés individuelles comme vous le faisiez.
La suggestion de Mirko de vérifier que le délégué est bien assigné est également critique. Vous voudrez vous assurer que la propriété déléguée de TOUS vos UITextFields de la nib ou du storyboard pointe vers le propriétaire du fichier. Sinon, le message du délégué n'ira nulle part et sera immédiatement ignoré!
essayez d'utiliser self.dancePlace.delegate = self;
au lieu de dancePlace.delegate = self;
pour définir UITextFieldDelegate. Ça marche?
Dans Swift 3:
//Dismiss keyboard , When touch outside
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
self.view.endEditing(true)
}