Comment rejeter le clavier iOS par programmation en appuyant sur Entrée

105

J'ai créé un UITextFieldprogramme faisant de la UITextFieldpropriété a du viewController. J'ai besoin de fermer le clavier avec le retour et le toucher sur l'écran. J'ai pu obtenir l'écran tactile pour ignorer, mais appuyer sur retour ne fonctionne pas.

J'ai vu comment le faire avec des storyboards et en allouant et en initialisant l' UITextFieldobjet directement 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
noobsmcgoobs
la source

Réponses:

265

Le moyen simple est de connecter le délégué de UITextFieldà self ( self.mytestField.delegate = self) et de supprimer le clavier dans la méthode en textFieldShouldReturnutilisant[textField resignFirstResponder];

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

[self.view endEditing:YES];

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

Nitin Gohel
la source
quand je connecte le délégué, cependant, j'obtiens des avertissements et / ou des erreurs. J'ai déjà vu votre chemin, mais pour une raison quelconque, je ne peux pas le faire fonctionner. Ces méthodes iraient-elles dans viewDidLoad?
noobsmcgoobs
1
Si vous rencontriez des erreurs lorsque vous avez essayé de définir le délégué textField sur self, vous n'avez probablement pas ajouté UITextFieldDelegate à la définition de classe. Plus précisément ... class ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting
29

Ajoutez une méthode déléguée UITextFieldcomme celle-ci:

@interface MyController : UIViewController <UITextFieldDelegate>

Et définissez votre textField.delegate = self;puis ajoutez également deux méthodes déléguées deUITextField

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

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
iPatel
la source
Nous devrions ajouter que ce qui précède ne fonctionne que si votre contrôleur implémente UITextFieldDelegate comme suit: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK
@iPatel J'ai mis ces 2 méthodes et ajouté self.username.delegate = self et [self.username resignFirstResponder] dans viewDidLoad. Cela fonctionne pour les deux scénarios dont j'avais besoin. Est-ce normal ou est-ce que j'utilise trop de code?
noobsmcgoobs
26

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

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

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)
Chathuranga Silva
la source
SWIFT 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
miff
17

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;
}
Sam
la source
9

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

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

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

DKong
la source
7

Essayez de vous faire une idée de ce qu'est un premier répondeur dans la hiérarchie des vues iOS. Lorsque votre champ de texte devient actif (ou premier répondeur) lorsque vous le touchez (ou lui passez le message par becomeFirstResponderprogramme), il présente le clavier. Donc, pour supprimer votre champ de texte du premier répondeur, 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 resignFirstRespondermessage.

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

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

Dans yourviewcontroller.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];
}
Takide
la source
1
rappelez-vous simplement l'action: @selector doit appeler le même nom de méthode que celui où vous faites endEditing: YES, dans ce cas "handleSingleTap:"
Marcos Reboucas
4

Pour ignorer un clavier après que le clavier est apparu, il y a 2 cas ,

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

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

2.Lorsque UITextField est en dehors 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 une vue de défilement, Tapping à l'extérieur ne déclenchera aucun événement , donc dans ce cas, utilisez un Tap Gesture Recognizer , faites glisser et déposez un UITapGesture pour la vue de défilement et créez une IBAction pour cela .

pour créer une IBAction, appuyez sur ctrl + cliquez sur UITapGesture et faites-le glisser vers 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 fournies proviennent du lien suivant, veuillez vous référer pour plus d'informations 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/


la source
Merci. Votre réponse m'a aidé ..!
Archit Kapoor
4

Pour un groupe de UITextViews à 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];
    }
}
Matias Elorriaga
la source
3

Étant donné que les balises indiquent uniquement qu'iOS je publierai la réponse pour Swift 1.2 et iOs 8.4, ajoutez-les dans la classe swift de votre contrôleur de vue:

// 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: -

N'oubliez pas non plus d'ajouter UITextFieldDelegate dans la déclaration de classe et de définir votre délégué de champs de texte sur self (la vue).

Juan Boero
la source
3

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)
        }
    }
Amul4608
la source
2

Voici donc ce que j'ai fait pour le faire disparaître après avoir touché l'arrière-plan ou le retour. J'ai dû ajouter le delegate = self dans viewDidLoad, puis aussi 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
noobsmcgoobs
la source
2

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

[[UIApplication sharedApplication].keyWindow endEditing:YES];
Linc
la source
1

Vous devez d'abord ajouter un delegete de champ de texte dans le fichier .h. sinon, déclarez que (BOOL)textFieldShouldReturn:(UITextField *)textFieldcette méthode n'a pas été appelée, alors ajoutez d'abord un délégué et écrivez le code de masquage du clavier dans cette méthode.

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

essaye celui-là..

Jitendra
la source
0

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;
}
Ravi_Parmar
la source
0
- (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 à l'écran Avec cette méthode, vous n'avez pas besoin de mentionner le champ de texte à chaque fois, comme

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

Swift 2:

c'est ce qu'on fait pour tout faire!

fermez le clavier avec le Donebouton ou Touch outSide, Nextpour passer à l'entrée suivante.

Premier changement TextFiled Return KeyPour NextStoryboard.

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)
}
Mojtabye
la source
0

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

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)
feu froid
la source
0

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 fonctionne simplement si vous voulez que tous les UItextfield fonctionnent de la même manière, ou si vous n'en avez qu'un!

hall.keskin
la source