106 votes

Rejeter le clavier en touchant le fond de UITableView

J’ai un avec sous forme de cellules. Je tiens à rejeter le clavier lorsque le fond de la est touché. Je suis en train de le faire en créant un la taille de la et de le placer derrière le . Le seul problème est la `` est attraper toutes les touches, même lorsque la touche est sur le UITableView. Ce que je fais mal ?

Merci !

203voto

mixja Points 1702

Cela se fait facilement par la création d'un UITapGestureRecognizer objet (par défaut, il va détecter un "geste" à un seul robinet, donc pas de personnalisation nécessaire), la spécification d'un objectif/action pour quand le geste est tiré, et puis, joignant le geste de reconnaissance d'objet à votre table.

E. g. Peut-être que dans votre méthode viewDidLoad:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[self.tableView addGestureRecognizer:gestureRecognizer];

Et le hideKeyboard méthode pourrait ressembler à ceci:

- (void) hideKeyboard {
    [textField1 resignFirstResponder];
    [textField2 resignFirstResponder];
    ...
    ...
}

Notez que le geste n'est pas déclenché lorsque vous touchez à l'intérieur d'un objet UITextField. Elle est cuite, mais sur la UITableView de fond, le pied de page vue, vue d'en-tête et sur UILabels à l'intérieur des cellules, etc.

128voto

Azbuky Points 776

La solution de UITapGestureRecognizer fonctionne avec une sélection de cellules de tableau, si vous définissez :

61voto

Saad Points 5363

Voici une meilleure façon de le faire. Il suffit de faire cela

ou

22voto

Rajive Jain Points 336

UITableView est une sous-classe de UIScrollView, mise en œuvre d’une méthode déléguée ci-dessous fournit une solution extrêmement facile et rapide. Aucun besoin de même n’impliquaient « resignFirstResponder » où afficher la hiérarchie introspects et trouve le répondeur actuel et lui demande de démissionner de son statut de répondeur.

Et n’oubliez pas d’ajouter UIScrollViewDelegate au fichier d’en-tête.

13voto

bbeckford Points 1932

Tout d'abord, écouter pour scrollViewWillBeginDragging dans votre UIViewController par l'ajout de la UIScrollViewDelegate:

Dans .h fichier:

@interface MyViewController : UIViewController <UIScrollViewDelegate> 

Dans .m fichier:

- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {

    [self dismissKeyboard];

}

Puis de les écouter pour les autres interactions:

- (void)setupKeyboardDismissTaps {

    UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeUpGestureRecognizer.cancelsTouchesInView = NO;
    swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
    [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];

    UISwipeGestureRecognizer *swipeDownGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeDownGestureRecognizer.cancelsTouchesInView = NO;
    swipeDownGestureRecognizer.direction = UISwipeGestureRecognizerDirectionDown;
    [self.tableView addGestureRecognizer:swipeDownGestureRecognizer];

    UISwipeGestureRecognizer *swipeLeftGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeLeftGestureRecognizer.cancelsTouchesInView = NO;
    swipeLeftGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.tableView addGestureRecognizer:swipeLeftGestureRecognizer];

    UISwipeGestureRecognizer *swipeRightGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeRightGestureRecognizer.cancelsTouchesInView = NO;
    swipeRightGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    [self.tableView addGestureRecognizer:swipeRightGestureRecognizer];


    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    tapGestureRecognizer.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tapGestureRecognizer];

}

Puis de mettre en œuvre dismissKeyboard:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    [yourTextFieldPointer resignFirstResponder];

}

Et si, comme moi, vous avez voulu fermer le clavier pour un UITextField à l'intérieur d'un tableau personnalisé de la cellule:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    CustomCellClass *customCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    [customCell.textFieldInCell resignFirstResponder]; 

}

Hope qui aide toute personne à la recherche!!

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