web-dev-qa-db-fra.com

Comment puis-je ignorer le clavier iOS?

J'ai un UITextfield que je voudrais rejeter le clavier pour. Je n'arrive pas à faire disparaître le clavier, peu importe le code que j'utilise.

73
Tyler McMaster
[myTextField resignFirstResponder]

Ici , deuxième paragraphe de la section Afficher et masquer le clavier.

62
Evan Mulawski

Si vous avez plusieurs champs de texte et que vous ne savez pas lequel est le premier répondant (ou si vous n'avez tout simplement pas accès aux champs de texte de l'endroit où vous écrivez ce code), vous pouvez appeler endEditing: dans la vue parent contenant les champs de texte.

Dans la méthode d'un contrôleur de vue, cela ressemblerait à ceci:

[self.view endEditing:YES];

Le paramètre force le champ de texte à annuler le statut de premier répondant. Si vous utilisiez un délégué pour effectuer la validation et vouliez tout arrêter jusqu'à ce que le contenu du champ de texte soit valide, vous pouvez également le coder comme suit:

BOOL didEndEditing = [self.view endEditing:NO];
if (didEndEditing) {
    // on to the next thing...
} else {
    // text field must have said to first responder status: "never wanna give you up, never wanna let you down"
}

La méthode endEditing: est bien meilleure que d'indiquer à resignFirstResponder des champs de texte individuels, mais pour une raison quelconque, je n'ai même jamais découvert cette information jusqu'à récemment.

188
benzado

Il existe des cas où aucun champ de texte n'est le premier répondant mais le clavier est à l'écran . Dans ce cas, les méthodes ci-dessus ne permettent pas de fermer le clavier.

Un exemple de comment y arriver:

  1. Appuyez sur ABPersonViewController à l'écran par programme; ouvrir n'importe quel contact;
  2. touchez le champ "note" (qui devient le premier répondeur et déclenche le clavier); 
  3. balayez à gauche sur n'importe quel autre champ pour faire apparaître le bouton "supprimer";
  4. à ce stade, vous n'avez pas de premier répondant dans les champs de texte (vérifiez simplement par programme), mais le clavier est toujours là. Appeler [view endEditing: YES] ne fait rien.

Dans ce cas, vous devez également demander au contrôleur de vue de quitter le mode d'édition:

[viewController setEditing:NO animated:YES];
8
user2216794

J'ai découvert un cas où endEditing et resignFirstResponder échouent. Cela a fonctionné pour moi dans ces cas.

ObjC

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

Rapide

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

Dans votre fichier YourViewController.h du contrôleur de vue, assurez-vous de mettre en œuvre le protocole UITextFieldDelegate:

@interface YourViewController : <UITextFieldDelegate>

@end

Ensuite, dans le fichier YourViewController.m, implémentez la méthode d'instance suivante:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.yourTextField1 resignFirstResponder];
    [self.yourTextField2 resignFirstResponder];
    ...
    [self.yourTextFieldn resignFirstResponder];
}
6
Thomas.Benz

Je vous suggère d'ajouter et d'action sur votre fichier d'en-tête:

-(IBAction)removeKeyboard;

Et dans l'implémentation, écrivez quelque chose comme ceci:

-(IBAction)removeKeyboard
{
[self.textfield resignFirstResponder];
}

Dans le fichier NIB, connectez-vous à partir de UITextFiled au propriétaire du fichier via l'option DidEndOnExit. De cette façon, lorsque vous appuierez sur la touche Entrée, le clavier disparaîtra. 

J'espère que ça aide!

6
naSh

Cela va renoncer à un champ de texte particulier 

// Swift
TextField.resignFirstResponder()

// Objective C
[TextField resignFirstResponder];

Pour renoncer à un champ de texte, utilisez le code ci-dessous. 

// Swift
self.view!.endEditing(true)

// Objective C
[self.view endEditing:YES];
2
Milap Kundalia

Si vous ne savez pas quel textField est le premier intervenant, vous pouvez le trouver. J'utilise cette fonction:

UIView *resignFirstResponder(UIView *theView)
{
    if([theView isFirstResponder])
    {
        [theView resignFirstResponder];
        return theView;
    }
    for(UIView *subview in theView.subviews)
    {
        UIView *result = resignFirstResponder(subview);
        if(result) return result;
    }
    return nil;
}

Ensuite, dans votre code appelez:

    UIView *resigned = resignFirstResponder([UIScreen mainScreen]);
2
BadPirate

Pour renoncer à un champ de texte dans l'application

UIApplication.shared.keyWindow?.endEditing(true)

Cette approche est propre et son fonctionnement est garanti car keyWindow est, par définition, la vue racine de toutes les vues possibles affichant un clavier ( source ):

La fenêtre de la clé reçoit des événements liés au clavier et autres événements non tactiles. Une seule fenêtre à la fois peut être la fenêtre clé.

2
Cœur
-(void)methodName
{
    [textFieldName resignFirstResponder];
}

appeler cette méthode (methodName) avec didEndOnExit

1
Pravi Jay

Pour Swift 3

Vous pouvez cacher le clavier comme ceci:

textField.resignFirstResponder()

Si vous souhaitez masquer le clavier lorsque l'utilisateur appuie sur le bouton "intro", vous devez implémenter la méthode UITextFieldDelegate suivante:

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

    textField.resignFirstResponder()

    return true
}
1
pableiros

Vous venez de remplacer yourTextFieldName par, vous l'avez deviné! votre champ de texte. Cela fermera le clavier.

[yourTextFieldName resignFirstResponder];
1
A.sharif

en dernier recours ????

let dummyTextView = UITextView(frame: .zero)
view.addSubView(dummyTextView)
dummyTextView.becomeFirstResponder()
dummyTextView.resignFirstResponder()
1
ochimasu

3 étapes simples et rapides

Ajoutez UITextFieldDelegate à votre classe comme ci-dessous:

class RegisterVC: UIViewController, UITextFieldDelegate {
    //class implementation 
}

dans l'implémentation de la classe, ajoutez la fonction de délégué textFieldShouldEndEditing::

internal func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return true
}

et comme dernière étape, configurez votre UITextField (s) délégué (s) sur vous-même, dans un endroit approprié. Par exemple, dans la fonction viewDidLoad:

override func viewDidLoad(){
    super.viewDidLoad()
    myTextField1.delegate = self
    myTextField2.delegate = self
    ..
    ..
}

Désormais, chaque fois que l'utilisateur appuie sur la touche Retour, le clavier est désactivé.

J'ai aussi préparé un exemple d'extrait, vous pouvez le vérifier depuis ici .

0
Mert Celik
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    // your code

    [textField reloadInputViews];
}
0
jeet.chanchawat