114 votes

Comment désactiver le clavier iOS de manière programmatique en appuyant sur la touche retour ?

J'ai créé un UITextField en rendant programmatiquement le UITextField une propriété du viewController. J'ai besoin de désactiver le clavier avec la touche retour et le toucher de l'écran. J'ai réussi à faire en sorte que le toucher de l'écran permette de rejeter le clavier, mais l'appui sur le retour ne fonctionne pas.

J'ai vu comment le faire avec des story-boards et en allouant et en initialisant les UITextField directement sans le créer en tant que propriété. Est-il possible de le faire ?

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    _username.delegate = self; 

    [self.view addSubview:self.username];
    [_username resignFirstResponder];

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"touchesBegan:withEvent:");
    [self.view endEditing:YES];
    [super touchesBegan:touches withEvent:event];
}

@end

9voto

DKong Points 91

Dans le délégué de l'application, vous pouvez écrire

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.window endEditing:YES];
}

En utilisant cette méthode, vous ne pouvez pas écrire trop de code.

7voto

Zen Points 2937

Essayez de vous faire une idée de ce qu'est un premier répondant dans la hiérarchie des vues d'iOS. Lorsque votre champ de texte devient actif (ou premier répondant) lorsque vous touchez à l'intérieur de celui-ci (ou que vous lui passez le message), il devient actif. becomeFirstResponder programmatiquement), il présente le clavier. Donc, pour que votre champ de texte ne soit pas le premier à répondre, vous devez transmettre le message suivant resignFirstResponder à cet endroit.

[textField resignFirstResponder];

Et pour cacher le clavier sur son bouton de retour, vous devez implémenter sa méthode déléguée textFieldShouldReturn: et passer le resignFirstResponder message.

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

7voto

user3822600 Points 1

Voici ce que j'utilise dans mon code. Cela fonctionne comme un charme !

Dans votreviewcontroller.h, ajoutez :

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Maintenant, dans le fichier .m, ajoutez ceci à votre fonction ViewDidLoad :

- (void)viewDidLoad {
    [super viewDidLoad];

    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

Ajoutez également cette fonction dans le fichier .m :

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}

5voto

Matias Elorriaga Points 184

Pour un groupe de UITextView à l'intérieur d'un ViewController :

Swift 3.0

for view in view.subviews {
    if view is UITextField {
        view.resignFirstResponder()
    }
}

Objectif-C

// hide keyboard before dismiss
for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        // no need to cast
        [view resignFirstResponder];
    }
}

4voto

Pour écarter un clavier après qu'il se soit affiché, il existe plusieurs possibilités 2 cas ,

  1. lorsque le champ UITextField est à l'intérieur d'un UIScrollView

  2. lorsque le champ UITextField est en dehors d'un UIScrollView

2.lorsque le UITextField est à l'extérieur d'un UIScrollView remplacez la méthode dans votre sous-classe UIViewController.

vous devez également ajouter un délégué pour tous les UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. Dans un la vue défilante, le tapotement à l'extérieur ne déclenchera pas d'événement donc dans ce cas utiliser un dispositif de reconnaissance des gestes de tapotement , Faites glisser et déposez un UITapGesture pour la vue défilante et créer une IBAction pour cette action .

pour créer une IBAction, appuyez sur ctrl+ cliquez sur l'UITapGesture et faites-la glisser vers le fichier .h du viewcontroller.

Ici, j'ai nommé tappedEvent comme nom d'action.

- (IBAction)tappedEvent:(id)sender {
      [self.view endEditing:YES];  }

l'information donnée par abouve a été dérivée du lien suivant, veuillez vous référer pour plus d'informations ou me contacter si vous ne comprenez pas les données abouve.

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/

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