Beaucoup de réponses intéressantes. Je voudrais compiler différentes approches dans la solution qui, selon moi, correspond le mieux à un scénario UITableView (c'est celui que j'utilise habituellement): ce que nous voulons généralement, c'est masquer le clavier dans deux scénarios: en tapant en dehors des éléments de l'interface utilisateur de texte, ou en faisant défiler l'UITableView vers le bas / vers le haut. Le premier scénario que nous pouvons facilement ajouter via un TapGestureRecognizer, et le second via la méthode UIScrollViewDelegate scrollViewWillBeginDragging :. Premier ordre du jour, la méthode pour masquer le clavier:
/**
* Shortcut for resigning all responders and pull-back the keyboard
*/
-(void)hideKeyboard
{
//this convenience method on UITableView sends a nested message to all subviews, and they resign responders if they have hold of the keyboard
[self.tableView endEditing:YES];
}
Cette méthode démissionne de toute interface utilisateur textField des sous-vues dans la hiérarchie de vues UITableView, c'est donc plus pratique que de résigner chaque élément indépendamment.
Ensuite, nous nous occupons du rejet via un geste Tap extérieur, avec:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[self setupKeyboardDismissGestures];
}
- (void)setupKeyboardDismissGestures
{
// Example for a swipe gesture recognizer. it was not set-up since we use scrollViewDelegate for dissmin-on-swiping, but it could be useful to keep in mind for views that do not inherit from UIScrollView
// UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
// swipeUpGestureRecognizer.cancelsTouchesInView = NO;
// swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
// [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
//this prevents the gestureRecognizer to override other Taps, such as Cell Selection
tapGestureRecognizer.cancelsTouchesInView = NO;
[self.tableView addGestureRecognizer:tapGestureRecognizer];
}
La définition de tapGestureRecognizer.cancelsTouchesInView sur NO permet d'éviter que gestureRecognizer ne remplace le fonctionnement interne normal de UITableView (par exemple, ne pas interférer avec la sélection de cellule).
Enfin, pour gérer le masquage du clavier lors du défilement haut / bas de UITableView, nous devons implémenter le protocole UIScrollViewDelegate scrollViewWillBeginDragging: méthode, comme:
fichier .h
@interface MyViewController : UIViewController <UIScrollViewDelegate>
fichier .m
#pragma mark - UIScrollViewDelegate
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self hideKeyboard];
}
J'espère que ça aide! =)