Багато цікавих відповідей. Я хотів би скласти різні підходи до рішення, яке, на мою думку, найкраще відповідає сценарію UITableView (саме той, який я зазвичай використовую): Те, що ми зазвичай хочемо, це в основному приховати клавіатуру за двома сценаріями: при натисканні назовні елементів Text UI, або прокручування вниз / вгору по UITableView. Перший сценарій ми можемо легко додати через TapGestureRecognizer, а другий через метод UIScrollViewDelegate scrollViewWillBeginDragging:. Перший порядок бізнесу, спосіб приховати клавіатуру:
/**
* 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];
}
Цей метод передає у відповідь будь-який інтерфейс текстового поля підпоглядом у межах ієрархії подання UITableView, тому це більш практично, ніж подавати у відставку кожен окремий елемент незалежно.
Далі ми піклуємось про звільнення за допомогою зовнішнього жесту натискання:
- (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];
}
Встановлення tapGestureRecognizer.cancelsTouchesInView на NO - це уникнути перекриття перебігом gestureRecognizer нормальних внутрішніх функцій UITableView (наприклад, не перешкоджати вибору комірок).
Нарешті, для обробки приховування клавіатури на Прокручування вгору / вниз по UITableView, ми повинні реалізувати протокол UIScrollViewDelegate протокол scrollViewWillBeginDragging: метод, як:
.h файл
@interface MyViewController : UIViewController <UIScrollViewDelegate>
.m файл
#pragma mark - UIScrollViewDelegate
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self hideKeyboard];
}
Я сподіваюся, що це допомагає! =)