Un moyen facile de supprimer le clavier?


377

J'ai pas mal de contrôles dispersés dans de nombreuses cellules de tableau dans mon tableau, et je me demandais s'il y avait un moyen plus simple de fermer le clavier sans avoir à parcourir tous mes contrôles et à les démissionner tous en tant que premier répondeur. Je suppose que la question est .. Comment pourrais-je obtenir le premier répondeur actuel au clavier?


bon complément à cette question: stackoverflow.com/questions/1490573/…
ericsoco

Une mise en garde à toutes les réponses ci-dessous. Si vous effectuez une séquence juste après avoir démissionné de la base de connaissances, la base de connaissances est orpheline et ne peut pas être rejetée. Vous devez ignorer la base de connaissances dans la méthode textFieldShouldReturn.
gjpc

26
le renvoi global du clavier dans le bon sens:[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Yerk

J'ai trouvé cette vidéo utile pinkstone.co.uk/… . Peut-être que cela peut aider les autres.
enthousiastegeek

Réponses:


797

Essayer:

[self.view endEditing:YES];

1
Cela semble fonctionner (testé sur ios4.1). Bien qu'il ne soit disponible que sur iOS 3.2. Je ne sais pas si cela est réellement garanti de fonctionner, ou s'il s'agit simplement d'un effet secondaire non garanti d'appeler une API d'une manière qui n'est pas documentée pour fonctionner.
JosephH

3
Cela a parfaitement fonctionné pour moi et est certainement préférable à certaines des autres réponses à cette question. Les documents disent qu'il est disponible dans iOS 2.0 et versions ultérieures.
antsyawn

8
Comme le dit la documentation: "Cette méthode examine la vue actuelle et sa hiérarchie de sous-vues pour le champ de texte qui est actuellement le premier répondeur. S'il en trouve un, il demande que ce champ de texte démissionne comme premier répondeur. Si le paramètre de force est défini à OUI, le champ de texte n'est même jamais demandé; il est obligé de démissionner. " - c'est donc l'OMI la bonne réponse à la question d'origine (cas d'utilisation: j'ai un formulaire avec des millions de champs, enfin - une dizaine ... ou plus, et j'ai besoin de fermer le clavier).
joshis

14
La réponse n'est pas fausse mais un peu incorrecte, en fait elle devrait l'être: [self.view endEditing:YES];comme les valeurs BOOL sont OUI / NON dans Objective-C.
chrisben

24
chrisben: Vous pouvez utiliser OUI / NON, VRAI / FAUX, 0/1.
Michael Superczynski

126

Vous pouvez forcer la vue en cours de modification à abandonner son statut de premier répondant avec [view endEditing:YES]. Cela cache le clavier.

Contrairement à -[UIResponder resignFirstResponder], -[UIView endEditing:]recherche dans les sous-vues pour trouver le premier répondant actuel. Vous pouvez donc l'envoyer à votre vue de niveau supérieur (par exemple self.viewdans a UIViewController) et il fera la bonne chose.

(Cette réponse incluait auparavant quelques autres solutions, qui ont également fonctionné mais étaient plus compliquées que nécessaire. Je les ai supprimées pour éviter toute confusion.)


Mais cela empêchera seulement le composant de devenir firstResponder, et ne supprimera pas le statut firstResponder actuel d'un élément.
Kendall Helmstetter Gelner le

Ce que je voulais dire en remplaçant devenez premier répondeur pour stocker le premier répondeur quelque part, afin qu'il soit accessible (dans ce cas, résigné) plus tard. Le problème de base est que Cocoa Touch ne fournit pas un moyen de demander une fenêtre ou de voir quel est son premier intervenant.
Nicholas Riley

+1 L'ajout de devenuFirstResponder a résolu les problèmes que j'avais avec les taps sur d'autres UITextFields.
Jason George

3
C'est obsolète. La [self.view endEditing:YES];réponse est meilleure.
ftvs

1
Ce n'est pas obsolète, cette réponse explique exactement comment ça [UIView endediting:]marche. Dans l'une des applications que j'ai développées, une zone de recherche a été ajoutée dans UINavigationViewController, si vous appelez simplement [self.view endEditing:YES], en tant que selfcontrôleur de vue, cela ne fonctionnera pas, à la place, j'ai appelé cette méthode directement dans la portée de la vue où la zone de recherche a été ajoutée, par exemple: [self.mySearchBoxView endEditing:YES].
Jan Cássio

92

Vous pouvez envoyer une action ciblée nulle à l'application, elle démissionnera à tout moment sans avoir à vous soucier de la vue qui a actuellement le statut de premier répondant.

Objectif c:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

Swift 3.0:

UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)

Aucune action ciblée n'est courante sur Mac OS X pour les commandes de menu, et en voici une utilisation sur iOS.


14
Meilleure solution de la page entière.
Leo Natan

Absolument la meilleure façon de se débarrasser du clavier de n'importe où dans l'application iOS.
Ben Sinclair du

Fonctionne toujours pour moi dans iOS8. Dans mon application, j'ai un menu de barre latérale, et il y a des moments où le contrôleur de vue "central" affiche le clavier. Et je veux fermer le clavier si le menu de la barre latérale s'affiche. J'ai donc ajouté ce code dans la méthode viewWillAppear du menu de la barre latérale.
Jenn Eve

1
Fonctionne toujours dans iOS 9. Excellent moyen de résigner globalement le focus d'un champ de texte et de fermer le clavier.
bmjohns

Et pour continuer cette séquence de commentaires particulière .... Fonctionne toujours dans iOS 10. :-)
Traveling Man

56

Pour être honnête, je ne suis folle d'aucune des solutions proposées ici. J'ai trouvé une bonne façon d'utiliser un TapGestureRecognizer qui, je pense, va au cœur de votre problème: lorsque vous cliquez sur autre chose que le clavier, fermez le clavier.

  1. Dans viewDidLoad, inscrivez-vous pour recevoir des notifications au clavier et créez un UITapGestureRecognizer:

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    
    [nc addObserver:self selector:@selector(keyboardWillShow:) name:
    UIKeyboardWillShowNotification object:nil];
    
    [nc addObserver:self selector:@selector(keyboardWillHide:) name:
    UIKeyboardWillHideNotification object:nil];
    
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
    action:@selector(didTapAnywhere:)];
    
  2. Ajoutez le clavier afficher / masquer les répondeurs. Là, vous ajoutez et supprimez le TapGestureRecognizer à l'UIView qui devrait fermer le clavier lorsque vous appuyez dessus. Remarque: il n'est pas nécessaire de l'ajouter à toutes les sous-vues ou commandes.

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
    
  3. Le TapGestureRecognizer appellera votre fonction quand il obtiendra un tap et vous pouvez fermer le clavier comme ceci:

    -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer {    
        [textField resignFirstResponder];
    }
    

La bonne chose à propos de cette solution est qu'elle ne filtre que pour les taps, pas les swipes. Donc, si vous avez du contenu défilant au-dessus du clavier, les balayages défileront toujours et laisseront le clavier affiché. En supprimant la reconnaissance des gestes après la disparition du clavier, les futurs appuis sur votre vue seront traités normalement.


À mon @implementation, j'ai ajouté @property (assign) UITapGestureRecognizer * tapRecognizer; et self.tapRecognizer modifié = [[UITapGestureRecognizer alloc] initWithTarget: auto action: @selector (didTapAnywhere :)];
Professeur Todd

J'essaie de faire une chose similaire, et je ne reçois pas le rappel sur le robinet. Curieux: pourquoi votre propriété est-elle «assignée»?
TahoeWolverine

Plus un, et en outre, cela devrait être le comportement iOS par défaut. Ou au moins ajoutez un moyen simple de basculer un bouton de fermeture.
Shaunti Fondrisi

24

C'est une solution pour faire disparaître le clavier lorsqu'il est touché returndans n'importe quel champ de texte, en ajoutant du code à un seul endroit (donc ne pas avoir à ajouter un gestionnaire pour chaque champ de texte):


considérez ce scénario:

j'ai un viewcontrolleravec deux champs de texte (nom d'utilisateur et mot de passe). et le protocole viewcontrollerimplémenteUITextFieldDelegate

je fais cela dans viewDidLoad

- (void)viewDidLoad 
{
    [super viewDidLoad];

    username.delegate = self;
    password.delegate = self;
}

et le viewcontroller implémente la méthode facultative comme

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

et quel que soit le champ de texte dans lequel vous vous trouvez, dès que j'appuie returnsur le clavier, il est rejeté!

Dans votre cas, la même chose fonctionnerait tant que vous définissez tous les délégués du champ de texte sur self et implémentez textFieldShouldReturn


Eh bien, j'ai déjà résolu le problème, mais dans mon cas, je voulais supprimer le clavier par moi-même (dans le code), et je ne savais pas quel textField avait le statut de premier répondant.
Seventoes

1
Il peut arriver que vous souhaitiez fermer le clavier sans appuyer sur "retour", par exemple lorsqu'un menu de la barre latérale est sur le point d'être affiché
Peter Johnson

Sous la direction de préciser que cette réponse est seulement pertinente dans des situations où frapper « retour » est une solution acceptable. [Dans mon cas, je voulais également ignorer le clavier lorsque l'utilisateur appuie en dehors du champ en cours de modification; cette réponse n'aide pas à cela.]
ToolmakerSteve

14

Une meilleure approche consiste à avoir quelque chose de «voler» le statut de premier répondant.

UIApplication étant une sous-classe de UIResponder, vous pouvez essayer:

[[UIApplication sharedApplication] becomeFirstResponder]
[[UIApplication sharedApplication] resignFirstResponder]

A défaut, créez un nouveau UITextField avec un cadre de taille nulle, ajoutez-le à une vue quelque part et faites quelque chose de similaire (suivi de la démission).


1
L'astuce UIApplication ne fonctionne pas (elle se bloque, au moins sur le simulateur) mais vous n'avez pas besoin d'un UITextField de taille zéro - choisissez simplement n'importe quel champ aléatoire et faites-le avec. Le devenir de NSResponder est une méthode de notification uniquement, mais pas UIResponder (la conception est pire, en fait).
Nicholas Riley

1
Aha, merci! Il se bloque en l'appelant sur UIApplication mais la taille nulle UITextField fonctionne très bien, et je n'ai pas à récupérer aucun de mes champs précédents.
Seventoes

Pourquoi quelqu'un ferait-il cela s'il existe une méthode officielle, parfaitement bonne et documentée pour cela?
Maciej Swic

2
Ils ne verraient pas, voir la réponse la plus votée pour la meilleure solution. Ce n'était tout simplement pas bien connu à l'époque (ma réponse était de 2009, l'autre réponse est venue plus d'un an plus tard en 2010). mais je le laisse pour la postérité.
Kendall Helmstetter Gelner

8

Rentrez cela dans une classe utilitaire.

+ (void)dismissKeyboard {
    [self globalResignFirstResponder];
}

+ (void) globalResignFirstResponder {
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    for (UIView * view in [window subviews]){
        [self globalResignFirstResponderRec:view];
    }
}

+ (void) globalResignFirstResponderRec:(UIView*) view {
    if ([view respondsToSelector:@selector(resignFirstResponder)]){
        [view resignFirstResponder];
    }
    for (UIView * subview in [view subviews]){
        [self globalResignFirstResponderRec:subview];
    }
}

1
C'est ce que je cherchais!
aslisabanci

Parfait, sauf que vous n'avez pas du tout besoin de la méthode globalResignFirstResponderRec, appelez simplement [view endEditing: YES] à la place. Ça fait la même chose.
n13

Ouais! La solution finale! J'ai essayé de nombreuses façons, seule celle-ci fonctionne pour moi! Merci beaucoup!
douyw

6

@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:

Absolument brillant!

Je vous remercie.

Compte tenu de vos conseils et des conseils des autres dans ce fil, voici ce que j'ai fait:

À quoi il ressemble lorsqu'il est utilisé:

[[self appDelegate] dismissKeyboard]; (Remarque: j'ai ajouté appDelegate en complément de NSObject pour pouvoir l'utiliser n'importe où sur n'importe quoi)

À quoi ça ressemble sous le capot:

- (void)dismissKeyboard 
{
    UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease];
    tempTextField.enabled = NO;
    [myRootViewController.view addSubview:tempTextField];
    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
}

ÉDITER

Amendement à ma réponse inclus tempTextField.enabled = NO;. La désactivation du champ de texte empêchera UIKeyboardWillShowNotificationet les UIKeyboardWillHideNotificationnotifications de clavier d'être envoyé si vous fier à ces notifications tout au long de votre application.


Je ne sais pas si cela fonctionne, mais cela semble un moyen intelligent et facile.
démon

5

Astuce rapide sur la façon de fermer le clavier dans iOS lorsqu'un utilisateur touche n'importe où sur l'écran en dehors de l'UITextField ou du clavier. Compte tenu de la superficie que le clavier iOS peut occuper, il est logique d'avoir un moyen simple et intuitif pour vos utilisateurs de fermer le clavier.

Voici un lien


Génial! l'ajout à AppDelegate le fait fonctionner pour TOUTES les vues liées.
Jiulong Zhao

5

Beaucoup de réponses trop compliquées ici, peut-être parce que ce n'est pas facile à trouver dans la documentation iOS. JosephH l'avait juste au-dessus:

[[view window] endEditing:YES];

4

Encore plus simple que la réponse de Meagar

écraser touchesBegan:withEvent:

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

Cela se produit dismiss the keyboardlorsque vous touchez n'importe où dans le background.


3

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 {
    //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];
}

Merci! Mais vous devriez renommer la fonction en «didTapAnywhere» ou la reconnaissance des gestes en «handleSingleTap» ;-)
Matthijs

2

Dans le fichier d'en-tête de votre contrôleur de vue, ajoutez <UITextFieldDelegate>à la définition de l'interface de votre contrôleur afin qu'elle soit conforme au protocole délégué UITextField ...

@interface someViewController : UIViewController <UITextFieldDelegate>

... Dans le fichier d'implémentation du contrôleur (.m), ajoutez la méthode suivante ou le code qu'il contient si vous avez déjà une méthode viewDidLoad ...

- (void)viewDidLoad
{
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTextBox.delegate = self;
}

... Ensuite, liez votreTextBox à votre champ de texte réel

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{
    if (theTextField == yourTextBox) {
        [theTextField resignFirstResponder];
    }
    return YES;
}

2

Vous devez envoyer endEditing:à la fenêtre de travail étant la sous-classe deUIView

[[UIApplication sharedApplication].windows.firstObject endEditing:NO];

Je parie que vous vouliez dire OUI à la place)
Matrosov Alexander

2

La meilleure façon de supprimer le clavier de UITableView et UIScrollView est:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

2

Dans swift 3, vous pouvez effectuer les opérations suivantes

UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)

1

La réponse de Jeremy ne fonctionnait pas tout à fait pour moi, je pense parce que j'avais une pile de navigation dans une vue d'onglet avec une boîte de dialogue modale dessus. J'utilise les éléments suivants en ce moment et cela fonctionne pour moi, mais votre kilométrage peut varier.

 // dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord

// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;

// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard {    // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard

    UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];

    UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called.  Probably is a way to determine this progragrammatically)
    UIViewController *uivc;
    if (myRootViewController.navigationController != nil) { // for when there is a nav stack
        uivc = myRootViewController.navigationController;
    } else {
        uivc = myRootViewController;
    }

    if (uivc.modalViewController != nil) { // for when there is something modal
        uivc = uivc.modalViewController;
    } 

    [uivc.view  addSubview:tempTextField];

    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];
    [tempTextField release];

}

Hmm - pourquoi le vote négatif? J'ai abordé des lacunes spécifiques du monde réel dans une autre réponse avec du code testé. Je peux comprendre un manque de votes positifs, mais me voter en territoire négatif est vraiment décourageant. J'espère toujours que la réponse ci-dessus aide quelqu'un d'autre.
JJ Rohrer

1

Vous devrez peut-être également remplacer UIViewController disablesAutomaticKeyboardDismissal pour que cela fonctionne dans certains cas. Cela peut être fait sur le UINavigationController si vous en avez un.


1

Sous-classe vos champs de texte ... et aussi les vues de texte

Dans la sous-classe, mettez ce code ..

-(void)conformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}

-(void)deConformsToKeyboardDismissNotification{

    [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}

- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self resignFirstResponder];
}

Dans les délégués textfield (de même pour les délégués textview)

-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
     [textField conformsToKeyboardDismissNotification];
}


- (void)textFieldDidEndEditing:(JCPTextField *)textField{
    [textField deConformsToKeyboardDismissNotification];
}

Tout est prêt. Maintenant, postez la notification de n'importe où dans votre code. Il démissionnera de n'importe quel clavier.


1

Et rapidement nous pouvons faire

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

Je ne comprends pas comment fonctionne le premier répondant .. où dois-je mettre cela? à mon avis contrôleur ou délégué?
Shayan C

Peu importe. Vous pouvez le placer où vous le souhaitez. à savoir l'action des boutons
Eike

1

Pour ignorer un clavier après son apparition, il y a 2 cas ,

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

  2. lorsque l'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, Taper à l'extérieur ne déclenchera aucun événement , 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 fournies ont été dérivées du lien suivant, veuillez vous référer pour plus d'informations ou me contacter 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/


0

Je déteste qu'il n'y ait aucun moyen "global" de rejeter le clavier par programmation sans utiliser d'appels d'API privés. Souvent, j'ai besoin de fermer le clavier par programmation sans savoir quel objet est le premier répondant. J'ai eu recours à l'inspection de l' selfutilisation de l'API d'exécution Objective-C, à l'énumération de toutes ses propriétés, à l'extraction de celles qui sont de type UITextFieldet à l'envoi du resignFirstRespondermessage.

Ça ne devrait pas être si difficile de faire ça ...


0

Ce n'est pas joli, mais la façon dont je démissionne du premier répondeur quand je ne sais pas ce qu'est le répondeur:

Créez un UITextField, soit dans IB, soit par programme. Rendez-le caché. Associez-le à votre code si vous l'avez fait dans IB. Ensuite, lorsque vous souhaitez fermer le clavier, vous basculez le répondeur vers le champ de texte invisible et vous le résignez immédiatement:

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];

0

Vous pouvez parcourir récursivement les sous-vues, stocker un tableau de tous les UITextFields, puis les parcourir et les démissionner tous.

Pas vraiment une excellente solution, surtout si vous avez beaucoup de sous-vues, mais pour les applications simples, cela devrait faire l'affaire.

J'ai résolu cela d'une manière beaucoup plus compliquée, mais beaucoup plus performante, mais en utilisant un singleton / manager pour le moteur d'animation de mon application, et chaque fois qu'un champ de texte devenait le répondeur, je l'assignais à une statique qui obtiendrait balayé (résigné) sur la base de certains autres événements ... il est presque impossible pour moi d'expliquer dans un paragraphe.

Soyez créatif, il ne m'a fallu que 10 minutes pour réfléchir à cela pour mon application après avoir trouvé cette question.


Résolu il y a quelques mois;) J'ai fini par enregistrer le champ actif sur le focus et l'utiliser.
Seventoes

0

Une méthode légèrement plus robuste que j'avais besoin d'utiliser récemment:

- (void) dismissKeyboard {
    NSArray *windows = [UIApplication sharedApplication].windows;

    for(UIWindow *window in windows) [window endEditing:true];

    //  Or if you're only working with one UIWindow:

    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

J'ai trouvé que certaines des autres méthodes "globales" ne fonctionnaient pas (par exemple, UIWebViewet ont WKWebViewrefusé de démissionner).


0

Ajoutez A Tap Gesture Recognizer à votre vue et définissez-la

votre fichier .m sera comme

    - (IBAction)hideKeyboardGesture:(id)sender {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *window in windows) [window endEditing:true];
    [[UIApplication sharedApplication].keyWindow endEditing:true];
}

Ça a marché pour moi


0

Oui, endEditing est la meilleure option. Et à partir d'iOW 7.0, UIScrollViewdispose d'une fonctionnalité intéressante pour ignorer le clavier lors de l'interaction avec la vue de défilement. Pour cela, vous pouvez définir la keyboardDismissModepropriété de UIScrollView.

Définissez le mode de fermeture du clavier comme suit:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

Il a peu d'autres types. Jetez un œil à ce document Apple .



0

la manière la plus simple est d'appeler la méthode

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    if(![txtfld resignFirstResponder])
    {
        [txtfld resignFirstResponder];
    }
    else
    {

    }
    [super touchesBegan:touches withEvent:event];
}

Vous n'avez pas besoin du «si» là-bas, resignFirstResponder fera de même de toute façon. Peut-être que vous vouliez dire - (BOOL) canResignFirstResponder?
Seventoes

0

Vous devez utiliser l'une de ces méthodes,

[self.view endEditing:YES];

ou

[self.textField resignFirstResponder];
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.