2011-08-02 4 views

Répondre

60
[myTextField resignFirstResponder] 

Here, deuxième paragraphe dans la section Gestion du clavier.

6

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

-(IBAction)removeKeyboard; 

Et dans la mise en œuvre, écrivez quelque chose comme ceci:

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

Dans le fichier NIB, connectez-vous du UITextFiled au File's Owner sur l'option DidEndOnExit. De cette façon, lorsque vous appuyez sur retour, le clavier disparaît.

J'espère que ça aide!

183

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

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

[self.view endEditing:YES]; 

Le paramètre force le champ de texte à démissionner statut de premier répondeur. Si vous utilisez un délégué pour effectuer la validation et je voulais tout arrêter jusqu'à ce que le contenu du champ de texte étaient valides, vous pouvez aussi le code comme ceci:

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 beaucoup mieux que de dire des champs de texte individuels resignFirstResponder , mais pour une raison que j'ignore, je ne l'ai jamais découvert jusqu'à récemment.

+70

Zut! Je n'arrive pas à croire que je viens de recevoir un commentaire sur un code. – Lytol

1

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

[yourTextFieldName resignFirstResponder]; 
1
-(void)methodName 
{ 
    [textFieldName resignFirstResponder]; 
} 

appeler cette méthode (methodName) avec didEndOnExit

2

Si vous ne savez pas quel textField est le premier répondeur 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; 
} 

Puis dans votre code appel:

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

Dans votre contrôleur de vue fichier YourViewController.h, 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]; 
} 
8

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

Un exemple de comment y arriver:

  1. pousser le ABPersonViewController à l'écran par programme; ouvrir un contact; Touchez le champ "note" (qui devient le premier répondeur et allume le clavier); Balayez vers la gauche dans tout autre champ pour faire apparaître le bouton "supprimer"; À ce stade, vous n'avez aucun premier répondant parmi les champs de texte (vérifiez simplement par programmation) 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 pour quitter le mode d'édition:

[viewController setEditing:NO animated:YES]; 
4

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]; 
2

Ce démissionnera un champ de texte particulier

// Swift 
TextField.resignFirstResponder() 

// Objective C 
[TextField resignFirstResponder]; 

Renoncer toute utilisation du champ de texte ci-dessous le code

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

// Objective C 
[self.view endEditing:YES]; 
0
-(void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    // your code 

    [textField reloadInputViews]; 
} 
-1
  1. Mettre en place la « Did End sur la sortie "événement dans Xcode (clic droit sur votre champ de texte).

    Screenshot

  2. Realize cette méthode:

    -(IBAction) closeKeyboard:(id) sender { 
        [_txtField resignFirstResponder]; 
    } 
    
1

Pour Swift 3

Vous pouvez cacher le clavier comme ceci:

textField.resignFirstResponder() 

Si vous voulez cacher le clavier lorsque la presse utilisateur sur le bouton « intro », vous devez mettre en œuvre la méthode UITextFieldDelegate suivante:

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

    textField.resignFirstResponder() 

    return true 
} 
Questions connexes