web-dev-qa-db-fra.com

Comment désactiver le clavier iOS par programme lorsque vous appuyez sur la touche Entrée

J'ai créé une UITextField faisant de la UITextField une propriété du programme viewController. Je dois fermer le clavier avec le retour et le toucher sur l'écran. J'ai réussi à faire en sorte que l'écran tactile disparaisse, mais appuyer sur la touche retour ne fonctionne pas. 

J'ai vu comment faire avec les storyboards et en affectant et en initialisant directement l'objet UITextField sans le créer en tant que propriété. Possible de 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
94
noobsmcgoobs

La méthode simple consiste à connecter le délégué de UITextField à self (self.mytestField.delegate = self) et à fermer le clavier dans la méthode textFieldShouldReturn à l'aide de [textField resignFirstResponder]; 

Une autre façon de fermer le clavier est la suivante:

[self.view endEditing:YES];

Placez [self.view endEditing:YES]; à l'endroit où vous souhaitez fermer le clavier (événement Button, événement Touch, etc.).

241
Nitin Gohel

Ajoutez une méthode de délégué de UITextField comme ceci:

@interface MyController : UIViewController <UITextFieldDelegate>

Et définissez votre textField.delegate = self;, puis ajoutez également deux méthodes de délégué de UITextField 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
29
iPatel

// Masquer le clavier en touchant l'arrière-plan dans la vue

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}
23
Vijay Dokrimare

utilisez simplement ceci dans Swift pour ignorer le clavier:

UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)

Swift 3

UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil)
19
Chathuranga Silva

Swift 4:

self.view.endEditing(true)

ou

Définissez le délégué du champ de texte sur le contrôleur de vue actuel, puis:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true

}

Objectif c:

[self.view endEditing:YES];

ou

Définissez le délégué du champ de texte sur le contrôleur de vue actuel, puis:

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

    return YES;
}
8
Sam

Dans le délégué d'applications, vous pouvez écrire

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

utiliser de cette façon, vous ne pouvez pas écrire trop de code.

6
DKong

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

[textField resignFirstResponder];

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

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

Pour un groupe de UITextViews dans une 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];
    }
}
3
Matias Elorriaga

Pour quitter un clavier une fois que le clavier est apparu, il y a 2 cas,

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

  2. quand UITextField est en dehors d'un UIScrollView 

2.quand UITTIFField se trouve en dehors d'une UIScrollView Remplacer la méthode dans votre sous-classe UIViewController

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

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. Dans une vue défilée , le fait de toucher à l'extérieur ne déclenchera aucun événement. Par conséquent, utilisez un Reconnaissance de gestes tactiles, Faites glisser un UITapGesture pour la vue de défilement et créer un IBAction pour cela.

pour créer une action IBAction, appuyez sur ctrl + clic sur UITapGesture et faites-la glisser dans le fichier .h de viewcontroller. 

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

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

les informations ci-dessus ont été dérivées du lien suivant. Pour plus d'informations, contactez-moi ou contactez-moi si vous ne comprenez pas les données ci-dessus.

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

3
user4993619

DANS Swift 3

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

OU

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == yourtextfieldName
        {
            self.resignFirstResponder()
            self.view.endEditing(true)
        }
    }
2
Rob-4608

Je sais que d’autres ont déjà répondu à cette question, mais j’ai trouvé un autre article qui couvrait également aucun événement de fond - tableview ou scrollview.

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

2
zainoz.zaini

Puisque les balises indiquent uniquement iOS, je posterai la réponse pour Swift 1.2 et iOs 8.4, ajoutez-les à votre classe de contrôleur de vue Swift:

// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    self.view.endEditing(true)

}

// MARK: - Close keyboard when return pressed
func textFieldShouldReturn(textField: UITextField!) -> Bool {

    textField.resignFirstResponder()

    return true
}
// MARK: -

De plus, n'oubliez pas d'ajouter UITextFieldDelegate dans la déclaration de classe et de définir votre délégation de champs de texte sur self (la vue).

2
Juan Boero

Alors voici ce que j'ai fait pour le faire disparaître après avoir touché l'arrière-plan ou revenir. J'ai dû ajouter le délégué = self dans viewDidLoad, puis les méthodes de délégué plus tard dans les fichiers .m. 

.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>


@property (strong, atomic) UITextField *username;

@end

.m
- (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;
    }
    self.username.delegate = self;
    [self.username resignFirstResponder];
    [self.view addSubview:self.username];


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    return YES;
}



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

@end
1
noobsmcgoobs

Tout d’abord, vous devez ajouter un fichier texte au format .h. sinon, déclarez (BOOL)textFieldShouldReturn:(UITextField *)textField cette méthode non appelée. ajoutez d'abord un délégué et écrivez du code de masquage du clavier dans cette méthode.

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

essaye celui-là..

1
Jitendra
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UITextField class]]) {
        [obj resignFirstResponder];
    }
}];
}

lorsque vous utilisez plus d’un champ de texte dans l’écran Avec cette méthode, vous n’avez pas besoin de mentionner chaque fois 

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];
0
Harshad

Ajouter un délégué: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

puis ajoutez cette méthode de délégué

// Cela devrait fonctionner parfaitement

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

Swift 2:

c'est ce qui est fait pour tout faire!

fermez le clavier avec le bouton Done ou Touch outSide, Next pour accéder à la prochaine entrée.

Changez d'abord TextFiled Return Key en Next dans StoryBoard.

override func viewDidLoad() {
  txtBillIdentifier.delegate = self
  txtBillIdentifier.tag = 1
  txtPayIdentifier.delegate  = self
  txtPayIdentifier.tag  = 2

  let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture")
  self.view.addGestureRecognizer(tap)

}

func textFieldShouldReturn(textField: UITextField) -> Bool {
   if(textField.returnKeyType == UIReturnKeyType.Default) {
       if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
           next.becomeFirstResponder()
           return false
       }
   }
   textField.resignFirstResponder()
   return false
}

func onTouchGesture(){
    self.view.endEditing(true)
}
0
Mojtabye

Si vous ne connaissez pas le contrôleur de vue actuel ou la vue texte, vous pouvez utiliser la chaîne de répondeur: 

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)
0
coldfire

Utilisez-le simplement dans Objective-C pour ignorer le clavier:

[[UIApplication sharedApplication].keyWindow endEditing:YES];
0
Linc

pour Swift 3-4 je fixe comme 

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}

il suffit de copier coller n'importe où sur la classe. Cette solution ne fonctionne que si vous voulez que tout UItextfield fonctionne de la même manière, ou si vous n'en avez qu'un!

0
hall.keskin