Много интересных ответов. Я хотел бы скомпилировать различные подходы в решение, которое, по моему мнению, лучше всего подходит для сценария UITableView (это тот, который я обычно использую): обычно мы хотим скрыть клавиатуру в двух сценариях: при нажатии за пределами текстовых элементов пользовательского интерфейса, или при прокрутке вниз / вверх UITableView. Первый сценарий мы можем легко добавить с помощью TapGestureRecognizer, а второй - с помощью метода scrollViewWillBeginDragging: UIScrollViewDelegate. Первый порядок работы, способ скрыть клавиатуру:
/**
* 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];
}
Этот метод отменяет любой пользовательский интерфейс textField вложенных представлений в иерархии представлений UITableView, поэтому он более практичен, чем отказ от каждого отдельного элемента по отдельности.
Затем мы позаботимся об отклонении с помощью внешнего жеста Tap, с помощью:
- (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, мы должны реализовать метод scrollViewWillBeginDragging: протокола UIScrollViewDelegate, как:
.h файл
@interface MyViewController : UIViewController <UIScrollViewDelegate>
.m файл
#pragma mark - UIScrollViewDelegate
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self hideKeyboard];
}
Я надеюсь, что это помогает! знак равно