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.
[myTextField resignFirstResponder]
Ici , deuxième paragraphe de la section Afficher et masquer le clavier.
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.
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:
Dans ce cas, vous devez également demander au contrôleur de vue de quitter le mode d'édition:
[viewController setEditing:NO animated:YES];
J'ai découvert un cas où endEditing
et resignFirstResponder
échouent. Cela a fonctionné pour moi dans ces cas.
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
[self setEditing:NO];
UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil)
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];
}
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!
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];
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]);
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é.
-(void)methodName
{
[textFieldName resignFirstResponder];
}
appeler cette méthode (methodName) avec didEndOnExit
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
}
Vous venez de remplacer yourTextFieldName
par, vous l'avez deviné! votre champ de texte. Cela fermera le clavier.
[yourTextFieldName resignFirstResponder];
en dernier recours ????
let dummyTextView = UITextView(frame: .zero)
view.addSubView(dummyTextView)
dummyTextView.becomeFirstResponder()
dummyTextView.resignFirstResponder()
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 .
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
// your code
[textField reloadInputViews];
}