Comment désactiver le clavier numérique en tapant n'importe où

j'aimerais connaître le code le plus simple pour rejeter le clavier numérique lorsque vous tapez à l'extérieur du clavier numérique. C'est une application simple pour entrer un nombre à l'intérieur d'un champ de texte et puis un utilisateur peut rejeter le clavier après que l'Utilisateur a fini de taper les nombres sur le champ de texte. Merci! :)

48
demandé sur Filip Radelic 2011-08-09 07:30:29

15 réponses

déclarer le champ de texte comme variable d'instance ou propriété s'il n'est pas déjà et mettre en œuvre une méthode simple comme celle-ci:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [textField resignFirstResponder];
}

ira très bien.

84
répondu Filip Radelic 2011-08-09 06:21:56

Essayez cette méthode,

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

tapez n'importe où et voyez que keyboard va rejeter. :- )

21
répondu Gajendra K Chauhan 2014-02-26 03:02:35

Pour Une Utilisation Chez Swift Code Ci-Dessous

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
 {
       textFiled.resignFirstResponder()
 }

regardez la dernière mise à jour de lien

7
répondu abdul sathar 2017-05-23 10:30:55

toucher L'arrière-plan pour fermer le clavier

aller à Xcode si vous n'êtes pas déjà là. Nous devons ajouter une action de plus à notre classe controller. Ajoutez la ligne suivante à votre Control_FunViewController.h fichier:

#import <UIKit/UIKit.h>
@interface Control_FunViewController : UIViewController { 
UITextField *nameField;
UITextField *numberField;
}
 @property (nonatomic, retain) IBOutlet UITextField *nameField; ]
@property (nonatomic, retain) IBOutlet UITextField *numberField; 
- (IBAction)textFieldDoneEditing:(id)sender; 
- (IBAction)backgroundTap:(id)sender; 
@end  

Enregistrer le fichier d'en-tête; basculer vers le fichier de mise en œuvre, et ajouter ce code, qui dit simplement aux deux champs de texte de donner le statut de premier répondant s'ils l'ont. Il est parfaitement sûr d'appeler resignfirtresponder sur un contrôle qui n'est pas le premier intervenant, de sorte que nous pouvons l'appeler en toute sécurité sur les deux champs de texte sans avoir à vérifier si l'un ou l'autre est le premier intervenant.

- (IBAction)backgroundTap:(id)sender { 
[nameField resignFirstResponder]; 
[numberField resignFirstResponder];
}

conseil Enregistrez ce fichier et retournez à Interface Builder. Nous avons maintenant besoin de changer la classe sous-jacente de notre plume. Si vous regardez la fenêtre principale de la nib , vous verrez qu'il y a trois icônes dans cette vue. La troisième, appelée Vue, est notre plume de l'écran principal qui contient toutes les autres contrôles et vues en tant que sous-vues. Cliquez une seule fois sur L'icône appelée View, qui représente la vue des conteneurs de notre nib. Pressez le 4 pour parler de l'inspecteur de l'identité. C'est là que nous pouvons changer la classe sous-jacente de n'importe quelle instance d'objet dans Interface Builder.

vous changerez beaucoup de fichiers d'en-tête et d'implémentation au fur et à mesure que vous codez. Heureusement, Xcode a une combinaison de touches qui vous permettra de passer rapidement entre ces fichiers. La combinaison de clés par défaut est: (Flèche option-command-up), bien que vous puissiez la modifier à tout ce que vous voulez en utilisant les préférences de Xcode.76

la classe de champ étiquetée indique actuellement UIView. Changez - le pour lire UIControl. Tous les contrôles qui sont capables de méthodes d'action trig - gering sont des sous-classes de UIControl, donc en changeant la classe sous-jacente, nous venons de donner à cette vue la capacité de déclencher des méthodes d'action. Vous pouvez vérifier cela en appuyant sur E2 pour faire monter l'Inspecteur des connexions.

faites glisser l'icône du propriétaire du fichier de l'événement de toucher vers le bas, et choisissez l'action backgroundTap: . Maintenant, des touches n'importe où dans la vue sans contrôle actif déclencheront notre nouvelle méthode d'action, ce qui provoquera la rétractation du clavier.

NOTE Enregistrer la plume, et nous allons revenir en arrière et essayer. Compilez et lancez votre application à nouveau. Cette fois, le clavier devrait disparaître, non seulement lorsque le bouton est actionné, mais aussi lorsque vous cliquez sur n'importe où ce n'est pas un contrôle actif, qui est le comportement de vos utilisateurs attendent.

6
répondu rptwsthi 2012-08-07 04:11:03

j'ai essayé de mettre en œuvre certaines des solutions ici et j'ai trouvé qu'il y avait des problèmes avec eux. Notamment, mon UIView contient un UIScrollView , qui semble intercepter des touches.

lorsque cela a échoué, j'ai considéré que "tapping anywhere" est un peu d'un comportement non spécifié, exigeant de l'utilisateur de deviner comment rejeter le clavier au lieu de leur donner des conseils clairs.

aussi, j'ai un bouton" Retour "ou" fait " sur chaque l'autre clavier que j'affiche dans l'application, donc j'étais déterminé à donner à l'utilisateur un moyen facile, intuitif, clairement spécifié pour rejeter le clavier avec un clavier numérique qui était en ligne avec les autres mécanismes de renvoi de clavier en usage.

je me rends compte que ce N'est pas ce que L'OP demande spécifiquement, mais je crois que c'est une meilleure solution que la demande" tap anywhere " (et c'est facile à mettre en œuvre!).

le code suivant est appelé -viewDidLoad dans mon UIViewController .

// My app is restricted to portrait-only, so the following works
UIToolbar *numberPadAccessoryInputView      = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44.0f)];

// My app-wide tint color is a gold-ish color, so darkGray contrasts nicely
numberPadAccessoryInputView.barTintColor    = [UIColor darkGrayColor];

// A basic "Done" button, that calls [self.textField resignFirstResponder]
UIBarButtonItem *numberPadDoneButton        = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self.textField action:@selector(resignFirstResponder)];

// It's the only item in the UIToolbar's items array
numberPadAccessoryInputView.items           = @[numberPadDoneButton];

// In case the background of the view is similar to [UIColor darkGrayColor], this
// is put as a contrasting edge line at the top of the UIToolbar
UIView *topBorderView                       = [[UIView alloc] initWithFrame:CGRectMake(0, 0, numberPadAccessoryInputView.frame.size.width, 1.0f)];
topBorderView.backgroundColor               = [UIColor whiteColor];
[numberPadAccessoryInputView addSubview:topBorderView];

// Make it so that this UITextField shows the UIToolbar
self.textField.inputAccessoryView           = numberPadAccessoryInputView;

avec cela, il y a un contrôle agréable, joli, intuitif ajouté au haut du clavier qui indique clairement comment l'utilisateur doit procéder quand ils sont finis avec leur entrée de texte.

je crois toujours Qu'Apple devrait fournir un bouton" Done " pour ce clavier (comme le lien posté par Janak Nirmal), mais c'est la solution non-Apple la plus élégante pour moi.

3
répondu mbm29414 2014-09-02 13:36:18

vous devez utiliser UITapGestureRecognizer pour ce faire.

UITapGestureRecognizer *tapToDismiss = [[UITapGestureRecognizer alloc]initWithTarget: self action: @selector (dismissNumberKeyBoard:)];

puis dans votre méthode de licenciement,

-(Void)dismissNumberKeyboard : (id)sender {

   [yourTextField resignFirstResponder];

}

bon codage!

2
répondu Valentina 2015-02-11 13:42:26

il suffit de faire une fonction simple comme celle-ci..

    -(IBAction)hideKeyboard:(id)Sender
{
    [_textValue resignFirstResponder];
}

maintenant allez au fichier ur nib et connectez cette fonction avec le champ de texte avec didEndOnExit et vous êtes bon pour aller. Maintenant, quand u clique en dehors de ur textfield, le clavier se cache.

1
répondu Hadi 2011-08-09 06:09:05

vous pouvez mettre en œuvre la réponse DE @mbm vraiment bien en mettant un didSet sur la sortie et en attachant votre inputAccessoryView là:

Code Swift:

  @IBOutlet var input: UITextField! { didSet {
    let toolbar = UIToolbar(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 0, height: 44)))
    toolbar.items = [
      UIBarButtonItem(barButtonSystemItem: .done, target: self.input,
        action: #selector(resignFirstResponder))
    ]
    input.inputAccessoryView = toolbar
  }}

dans xcode 8 / iOS 10 il finit par ressembler à quelque chose comme ceci:

enter image description here

1
répondu SimplGy 2016-09-02 00:56:06

normalement, quand l'utilisateur touche sur le bouton "Cancel", Je l'utilise pour rejeter clavier -

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar
{
    NSLog(@"cancel clicked");
    [searchBar resignFirstResponder]; // dismiss keyboard
    return;
}

si vous voulez faire cela pour quand l'utilisateur touche n'importe où en dehors de la zone de clavier, alors vous devez mettre en œuvre touchesEnded et mettre ce code là -

/* Delegate for when touch ends.  */
-(void)touchesEnded:(NSSet *)touches 
          withEvent:(UIEvent *)event
{
    [searchBar resignFirstResponder];
}

Je n'ai moi-même pas essayé cela, mais je sais que cela devrait faire l'affaire...

0
répondu Srikar Appalaraju 2011-08-09 03:45:39

j'ai dû implémenter un UX similaire pour mon UITableView (à l'intérieur duquel apparaît un UITextField). Tout d'abord, ajouter un UITapGestureRecognizer à tableView. Cela commencera à saisir tous les robinets qui se produisent à partir de maintenant.

UITapGestureRecognizer* tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
        [self.tableView addGestureRecognizer:tapGestureRecognizer];
        [tapGestureRecognizer release];

l'effet secondaire est cependant, que vous ne voulez pas rejeter le clavier lorsque l'utilisateur tape sur L'UITextField lui-même. Cette affaire doit donc être distinguée.

l'implémentation de la méthode handleTap ressemble à quelque chose comme-

/*
 In the text editing mode, listens to all taps occurring on the table view to exit the mode. There are two special cases to consider:
 a) Text field's clear button
 b) Text field
 */
-(void)handleTap:(UITapGestureRecognizer*)tapRecognizer 
{
    if(tapRecognizer.state == UIGestureRecognizerStateEnded) 
    {

            //Figure out where the user tapped
            CGPoint p = [tapRecognizer locationInView:textField];
            CGRect textFieldBounds = textField.bounds;
            CGRect clearButtonBounds = CGRectMake(textFieldBounds.origin.x + textFieldBounds.size.width - 44, textFieldBounds.origin.y, 44, textFieldBounds.size.height); 

            if(CGRectContainsPoint(clearButtonBounds, p))
                textField.text = @"";

            if(CGRectContainsPoint(textFieldBounds, p))
                return;

        [textField resignFirstResponder];
        //remove the tap gesture recognizer that was added.
        for(id element in self.tableView.gestureRecognizers)
        {
        if([element isKindOfClass:[UITapGestureRecognizer class]])
        {
            [self.tableView removeGestureRecognizer:element];
        }
        }
    }
        [self commitNewText];
    }
}

HTH. Marquer comme la réponse si vous le souhaitez.

- Akshay

0
répondu Akshay 2011-08-09 03:53:58

si vous avez fait un pavé numérique personnalisé ou un autre popover, une autre solution serait d'utiliser un reconnaisseur de geste dans l'entrée de votre uivi comme ceci:

tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self addGestureRecognizer:tapper];

 _yourViewController = [[CustomViewController alloc] init];
_yourPopoverController = [[UIPopoverController alloc] initWithContentViewController:_yourViewController];
_yourPopoverController.popoverContentSize = CGSizeMake(550, 300);
_yourViewController.delegate = self;

et avoir le handleSingleTap rejeter le popover si visible et rejeter l'édition:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    if ([_yourPopoverController isPopoverVisible]) {
        [_yourPopoverController dismissPopoverAnimated:YES];
    }

    [self endEditing:YES];
}
0
répondu arinmorf 2014-02-26 09:07:43

Dans xcode 5 Utiliser un Robinet Geste de Reconnaissance et de le déclarer dans le .h avec l'action ont choisi un nom et dans .m

- (IBAction)backgroundTap:(id)sender {
    [self.view endEditing: YES];
}
0
répondu gerachev 2014-08-26 18:13:09

beaucoup de réponses ici, mais avait encore du mal à comprendre en utilisant XCode 5. Lire ce: https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html

ajoutez un outil de reconnaissance de geste à votre Viscrollview. Définir son délégué pour être le viewcontroller.

ajouter cette méthode:

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

à votre code D'implémentation UIScrollView et associez-le au Tap gestuel Recognizer en cliquant sur contrôle et en faisant glisser vers le code d'implémentation.

travaillait pour moi.

0
répondu Bill Noto 2015-01-18 02:33:03

pour Swift, le plus facile pour rejeter le clavier pour tous les champs de texte en tapant n'importe où en dehors du champ de texte est:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
    self.view.endEditing(true)
}
0
répondu XIII 2015-02-02 06:34:03

pour swift 3/4 j'aime ce cas:

  1. le contrôleur de vue est une sous-classe pour UITextFieldDelegate
  2. dans la fonction viewDidLoad, vous devez définir yourPhonePadField.delegate = self
  3. et remplacer cette fonction:

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
       self.view.endEditing(true) 
    }
    
0
répondu Oleksii Radetskyi 2018-01-22 17:28:47