383 votes

Moyen facile de rejeter le clavier?

J’ai tout à fait quelques contrôles disséminés dans plusieurs cellules d’un tableau dans ma table, et je me demandais si il existe un moyen plus facile de rejeter le clavier sans avoir à effectuer une boucle sur tous mes contrôles et leur démission tout comme le premier intervenant. Je suppose que la question est... Comment pourrais-je obtenir le premier intervenant actuel au clavier ?

805voto

kirby Points 5094

Essayez :``

126voto

Nicholas Riley Points 26161

Vous pouvez forcer le mode édition de démissionner de son premier intervenant statut d' [view endEditing:YES]. Ce qui permet de masquer le clavier.

Contrairement aux -[UIResponder resignFirstResponder], -[UIView endEditing:] recherche dans les sous-vues de l'actuel premier intervenant. De sorte que vous pouvez l'envoyer à votre affichage de niveau supérieur (par exemple, self.view en UIViewController) et il va faire la bonne chose.

(Cette réponse précédemment inclus un couple de d'autres solutions, qui ont également travaillé, mais ont été plus compliqué que nécessaire. J'ai supprimé afin d'éviter toute confusion.)

94voto

Travelling Man Points 435

Vous pouvez envoyer une néant une action ciblée à l’application, il va démissionner premier intervenant à tout moment sans avoir à se soucier dont la vue a actuellement premier statut de répondeur.

Des actions ciblées néant sont communes sur Mac OS X pour les commandes de menu, et voici une utilisation pour eux sur iOS.

56voto

Brett Levine Points 448

Pour être honnête, je ne suis pas fou au sujet de toutes les solutions proposées ici. J'ai trouvé une belle façon d'utiliser un TapGestureRecognizer qui, je pense, est au cœur de votre problème: Lorsque vous cliquez sur n'importe quoi sauf le clavier, fermer le clavier.

  1. Dans le viewDidLoad, vous inscrire pour recevoir le clavier de notifications et de créer 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. Ajouter le clavier afficher/masquer les intervenants. Il vous permet d'ajouter et de supprimer la TapGestureRecognizer à la UIView que de rejeter le clavier lorsque vous appuyez dessus. Remarque: Vous n'avez pas à l'ajouter à tous les sous-points de vue ou des contrôles.

    -(void) keyboardWillShow:(NSNotification *) note {
        [self.view addGestureRecognizer:tapRecognizer];
    }
    
    -(void) keyboardWillHide:(NSNotification *) note
    {
        [self.view removeGestureRecognizer:tapRecognizer];
    }
    
  3. Le TapGestureRecognizer appelle votre fonction lorsqu'il obtient un robinet 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 les filtres des Robinets, pas de glisse. Donc, si vous avez le défilement de contenu au-dessus du clavier, de glissements va encore faire défiler et laissez le clavier affiché. En supprimant le geste de reconnaissance une fois que le clavier est parti, l'avenir de robinets sur votre point de vue doit être géré normalement.

24voto

prakash Points 18075

je ne suis pas vraiment sûr de savoir pourquoi on aurait besoin pour passer à travers tout cela.

considérez le scénario suivant:

j'ai un viewcontroller avec deux objets textfield (nom d'utilisateur et mot de passe). et l' viewcontroller implémente UITextFieldDelegate protocole

je le fais ce dans le 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, dès que j'ai touché return dans le clavier, il obtient rejeté!

Dans votre cas, le principe est le même travail tant que vous définissez tous les champs du délégué à l'autonomie et à mettre en œuvre textFieldShouldReturn

S'il vous plaît corrigez-moi si je suis absent de ce qui est évident!!

Cheers - Prakash

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X