Отключите клавиатуру, коснувшись фона UITableView
У меня есть UITableView
с UITextField
как ячейки. Я хотел бы убрать клавиатуру, когда коснулся фона UITableView
. Я пытаюсь сделать это, создав UIButton
размер UITableView
и разместив его за UITableView
. Единственная проблема заключается в том, что UIButton
захватывает все касания, даже когда сенсорный экран находится в UITableView. Что я делаю неправильно?
Спасибо!
Ответы
Ответ 1
Это легко сделать, создав объект UITapGestureRecognizer (по умолчанию это обнаружит "жест" одним касанием, поэтому дальнейшая настройка не требуется), указав цель/действие для запуска жеста, а затем прикрепив объект распознавателя жестов. к вашему виду таблицы.
Например, возможно, в вашем методе viewDidLoad
:
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[self.tableView addGestureRecognizer:gestureRecognizer];
И метод hideKeyboard
может выглядеть так:
- (void) hideKeyboard {
[textField1 resignFirstResponder];
[textField2 resignFirstResponder];
...
...
}
Обратите внимание, что этот жест не срабатывает при касании внутри объекта UITextField
. Он запускается на фоне UITableView
, представлении UILabels
колонтитула, представлении заголовка и UILabels
внутри ячеек и т.д.
Ответ 2
Решение UITapGestureRecognizer работает с выбором ячейки таблицы, если вы устанавливаете:
gestureRecognizer.cancelsTouchesInView = NO;
Ответ 3
Вот лучший способ сделать это.
Просто сделайте это
[self.view endEditing:YES];
или
[[self.tableView superView] endEditing:YES];
Ответ 4
Вы также можете сделать это из раскадровки:
![введите описание изображения здесь]()
Ответ 5
Поскольку UITableView
является подклассом UIScrollView
, реализация одного метода делегата ниже обеспечивает чрезвычайно простое и быстрое решение. Нет необходимости даже привлекать resignFirstResponder
поскольку иерархия представления resignFirstResponder
и находит текущего респондента и просит его отказаться от статуса респондента.
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self.view endEditing:YES];
}
И не забудьте добавить UIScrollViewDelegate
в заголовочный файл.
Ответ 6
Во-первых, прослушайте scrollViewWillBeginDragging
в вашем UIViewController
, добавив UIScrollViewDelegate
:
В .h файле:
@interface MyViewController : UIViewController <UIScrollViewDelegate>
В .m файле:
- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {
[self dismissKeyboard];
}
Тогда слушайте другие взаимодействия:
- (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];
}
Затем выполните dismissKeyboard
:
- (void)dismissKeyboard {
NSLog(@"dismissKeyboard");
[yourTextFieldPointer resignFirstResponder];
}
И если, как и я, вы хотите отклонить клавиатуру для UITextField внутри пользовательской ячейки таблицы:
- (void)dismissKeyboard {
NSLog(@"dismissKeyboard");
CustomCellClass *customCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
[customCell.textFieldInCell resignFirstResponder];
}
Надеюсь, что это поможет любому в поиске!
Ответ 7
tableView.keyboardDismissMode = .onDrag
Ответ 8
Я сделал это вот так:
Создайте метод в вашем TableViewController для дезактивации первого ответчика (который будет вашим TextBox в этой точке)
- (BOOL)findAndResignFirstResonder:(UIView *)stView {
if (stView.isFirstResponder) {
[stView resignFirstResponder];
return YES;
}
for (UIView *subView in stView.subviews) {
if ([self findAndResignFirstResonder:subView]) {
return YES;
}
}
return NO;
}
В tableView:didSelectRowAtIndexPath:
вызовите предыдущий метод:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
...
[self findAndResignFirstResonder: self.view];
...
}
Ответ 9
Вот быстрая версия для вашего удовольствия от кодирования:
Он добавляет распознаватель жестов, затем отклоняет клавиатуру. Не требуется выход для TextField!
override func viewDidLoad() {
super.viewDidLoad()
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
}
func handleTap(sender: UITapGestureRecognizer) {
if sender.state == .Ended {
view.endEditing(true)
}
sender.cancelsTouchesInView = false
}
Ответ 10
У меня был UITableViewController
, а реализация touchesBegan:withEvent:
не работала для меня.
Вот что сработало:
Swift:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
view.endEditing(true)
}
Objective-C:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self.view endEditing:YES];
}
Ответ 11
@interface DismissableUITableView : UITableView {
}
@end
@implementation DismissableUITableView
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.superview endEditing:YES];
[super touchesBegan:touches withEvent:event];
}
@end
Затем убедитесь, что в вашем файле Nib вы устанавливаете тип UITableView в DismissableUITableView..... возможно, я мог подумать о лучшем имени для этого класса, но вы поняли смысл.
Ответ 12
Если вы ориентируетесь на iOS7, вы можете использовать одно из следующих действий:
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
Первый будет анимировать клавиатуру с экрана, когда прокручивается табличное представление, а позже будет скрывать клавиатуру, как приложение "Акции".
Обратите внимание, что это от UIScrollView
, который UITableView
наследует.
Ответ 13
Существует версия Swift 3 без блокировки нажатий на ячейки.
В viewDidLoad()
метод:
let dismissKeyboardGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
dismissKeyboardGesture.cancelsTouchesInView = false
tableView.addGestureRecognizer(dismissKeyboardGesture)
И hideKeyboard
выглядит следующим образом:
func hideKeyboard() {
view.endEditing(true)
}
Ответ 14
UITableView является подклассом UIScrollView.
То, как я это делал, это прослушивание пользователем прокрутки, а затем resignFirstResponder. Здесь используется метод UIScrollViewDelegate для реализации в вашем коде;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
При приближении к таким типам проблем я нашел лучший способ - исследовать протоколы делегатов для каждого объекта и классов родительских классов (в этом случае UITableViewDelegate, UIScrollViewDelegate. Число событий, вызванных объектами NS, довольно велико и Кроме того, проще реализовать протокол, а затем подклассифицировать что-либо.
Ответ 15
У меня была такая же проблема, и здесь мое решение, это отлично работает для меня:
В представлении или контроллере представления, который вы внедрили <UITextFieldDelegate>
(В моем случае у меня есть пользовательский UITableViewCell
, называемый TextFieldCell),
Объявить UITapGestureRecognizer
как свойство:
@interface TextFieldCell : UITableViewCell <UITextFieldDelegate>
{
UITextField *theTextField;
UITapGestureRecognizer *gestureRecognizer;
}
@property (nonatomic,retain) UITextField *theTextField;
@property (nonatomic,retain) UITapGestureRecognizer *gestureRecognizer;
И инициализируйте его в своем представлении/контроллере:
self.gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard:)];
В методе - (void)textFieldDidBeginEditing:(UITextField *)textField
используйте superView
, чтобы перейти к таблице TableView и вызвать addGestureRecognizer
:
[self.superview.superview addGestureRecognizer:gestureRecognizer];
И в - (void)textFieldDidEndEditing:(UITextField *)textField
просто удалите распознаватель жестов:
[self.superview.superview removeGestureRecognizer:gestureRecognizer];
Надеюсь, что это поможет.
Ответ 16
Я хотел, чтобы моя ячейка открыла клавиатуру, когда была выбрана какая-либо часть ячейки, и закройте ее, если вы щелкнули где-нибудь в клетке. Чтобы открыть клавиатуру:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
if (selected)
{
[self.textField becomeFirstResponder];
}
}
(ПРИМЕЧАНИЕ. Я подклассифицировал ячейку, но вы можете легко достичь этого в методе делегата tableView:didSelectRowAtIndexPath:
UITableView
)
Это означало, что при использовании верхних решений, если вы нажимаете на ячейку дважды, клавиатура дрожит, поскольку сначала распознаватель жестов пытался закрыть клавиатуру, а затем ячейка была повторно выбрана и попробовала открыть клавиатуру.
Решение состоит в том, чтобы проверить, произошел ли щелчок внутри текущей выбранной ячейки:
- (void)viewDidLoad
{
[super viewDidLoad];
//gesture recognizer to close the keyboard when user taps away
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(dismissKeyboard:)];
tap.cancelsTouchesInView = NO;
[self.tableView addGestureRecognizer:tap];
}
-(void)dismissKeyboard:(UIGestureRecognizer*)tapGestureRecognizer
{
if (!CGRectContainsPoint([self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]].frame, [tapGestureRecognizer locationInView:self.tableView]))
{
[self.view endEditing:YES];
}
}
Ответ 17
Я нашел решение, которое отлично работает.
Необходимо использовать UIGestureRecognizerDelegate и метод - gestureRecognizer: shouldReceiveTouch:.
Добавьте распознаватель жестов в TableView следующим образом:
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
tapGestureRecognizer.cancelsTouchesInView = NO;
tapGestureRecognizer.delegate = self;
[self.suggestedTableView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];
Затем примените метод делегата shouldReceiveTouch, чтобы отклонить штрихи, которые выполняются в классе UITableViewCell. Метод hideKeyboard будет вызываться только тогда, когда касание выполнено вне класса UITableViewCell.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if([touch.view isKindOfClass:[UITableViewCell class]]) {
return NO;
}
// UITableViewCellContentView => UITableViewCell
if([touch.view.superview isKindOfClass:[UITableViewCell class]]) {
return NO;
}
// UITableViewCellContentView => UITableViewCellScrollView => UITableViewCell
if([touch.view.superview.superview isKindOfClass:[UITableViewCell class]]) {
return NO;
}
return YES; // handle the touch
}
- (void) hideKeyboard{
[textField resignFirstResponder];
}
Ответ 18
Я искал решение и не нашел ничего, что бы соответствовало моему коду, поэтому я сделал это вот так:
http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap
В основном это сочетание вышеупомянутых подходов, но не требует подкласса что-либо или создания фоновых кнопок.
Ответ 19
Просто используя UITapGestureRecognizer и cancelsTouchesInView = NO
означает, что нажатия на ячейки и UITextViews также запускают скрытие. Это плохо, если у вас несколько UITextViews, и вы нажимаете на следующий. Клавиатура начнет скрываться, а затем следующий textView станет первымResponder, и клавиатура снова станет видимой. Чтобы этого избежать, проверьте расположение крана и только спрячьте клавиатуру, если кран не находится в ячейке:
// init
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapTableView:)];
tapRecognizer.cancelsTouchesInView = NO;
[self.tableView addGestureRecognizer:tapRecognizer];
// Hide on tap
- (void)didTapTableView:(UITapGestureRecognizer *)tap
{
CGPoint point = [tap locationInView:tap.view];
[self.view endEditing:!CGRectContainsPoint([self.tableView rectForRowAtIndexPath:[self.tableView indexPathForRowAtPoint:point]], point)];
}
Чтобы запустить scrollViewWillBeginDragging:
, свойство tableView scrollEnabled
должно быть YES
// Hide on scroll
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self.view endEditing:YES];
}
Ответ 20
Почему вы хотите создать таблицу с полными текстовыми полями? Вы должны использовать подробный вид для каждой строки, содержащей текстовые поля.
Когда вы нажимаете подробный просмотр, убедитесь, что вы вызываете "[myTextField статьFirstResponder]", чтобы пользователь мог начать редактирование всего одним щелчком мыши из списка таблиц.
Ответ 21
Если вы готовы к подклассу (ugh!) вашего представления в таблице, что-то вроде этого может работать:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
BOOL backgroundTouched = YES;
for (UITouch *touch in touches) {
CGPoint location = [touch locationInView:self];
for (UITableViewCell *cell in self.visibleCells) {
if (CGRectContainsPoint(cell.frame, location)) {
backgroundTouched = NO;
break;
}
}
}
if (backgroundTouched) {
for (UITableViewCell *cell in self.visibleCells) {
// This presumes the first subview is the text field you want to resign.
[[cell.contentView.subviews objectAtIndex:0] resignFirstResponder];
}
}
[super touchesBegan:touches withEvent:event];
}
Ответ 22
Если вы хотите убрать клавиатуру, пока нажата клавиша возврата, вы можете просто добавить следующий код в textField, чтобы вернуть метод i.e.:
- (BOOL)textFieldShouldReturn:(UITextField *)atextField
{
[textField resignFirstresponder];
}
Некоторые текстовые поля могут иметь представление выбора или другое как подвью, поэтому в этом случае вышеупомянутый метод не работает, поэтому в этом случае нам нужно использовать класс UITapGestureRecognizer, то есть добавить следующий фрагмент кода для просмотра методаDidLoad, т.е.
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
Теперь просто добавьте ответчик resial к методу выбора i.e.:
-(void)dismissKeyboard
{
[textField resignFirstResponder];
}
Надеюсь, это поможет, спасибо:)
Ответ 23
Много интересных ответов. Я хотел бы скомпилировать различные подходы к решению, которое, по моему мнению, наилучшим образом соответствует сценарию 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 to NO - это исключение, чтобы gesureRecognizer отменял нормальную внутреннюю работу UITableView (например, чтобы не мешать выбору ячеек).
Наконец, чтобы обработать скрытие клавиатуры при прокрутке вверх/вниз UITableView, мы должны реализовать протокол UIScrollViewDelegate scrollViewWillBeginDragging: method, как:
.h файл
@interface MyViewController : UIViewController <UIScrollViewDelegate>
.m file
#pragma mark - UIScrollViewDelegate
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self hideKeyboard];
}
Надеюсь, это поможет! =)
Ответ 24
Вот как я наконец сделал работы. Я объединил предложения и коды из разных ответов.
Особенности: отклонение клавиатуры, перемещение текстовых полей над клавиатурой при редактировании и установка типа "Next" и "Done". REPLACE "..." с большим количеством полей
static const CGFloat ANIMATION_DURATION = 0.4;
static const CGFloat LITTLE_SPACE = 5;
CGFloat animatedDistance;
CGSize keyboardSize;
@interface ViewController () <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *firstNameTXT;
.....// some other text fields
@property (weak, nonatomic) IBOutlet UITextField *emailTXT;
@end
@implementation ViewController
- (void)viewDidLoad{
.....
// add tap gesture to help in dismissing keyboard
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(tapScreen:)];// outside textfields
[self.view addGestureRecognizer:tapGesture];
// set text fields return key type to Next, last text field to Done
[self.firstNameTXT setReturnKeyType:UIReturnKeyNext];
.....
[self.emailTXT setReturnKeyType:UIReturnKeyDone];
// set text fields tags
[self.firstNameTXT setTag:0];
....// more text fields
[self.emailTXT setTag:5];
// add keyboard notification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}
// dismiss keyboard when tap outside text fields
- (IBAction)tapScreen:(UITapGestureRecognizer *)sender {
if([self.firstNameTXT isFirstResponder])[self.firstNameTXT resignFirstResponder];
...
if([self.emailTXT isFirstResponder])[self.emailTXT resignFirstResponder];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
if(textField.returnKeyType==UIReturnKeyNext) {
// find the text field with next tag
UIView *next = [[textField superview] viewWithTag:textField.tag+1];
[next becomeFirstResponder];
} else if (textField.returnKeyType==UIReturnKeyDone || textField.returnKeyType==UIReturnKeyDefault) {
[textField resignFirstResponder];
}
return YES;
}
// Moving current text field above keyboard
-(BOOL) textFieldShouldBeginEditing:(UITextField*)textField{
CGRect viewFrame = self.view.frame;
CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];
CGFloat textFieldBottomLine = textFieldRect.origin.y + textFieldRect.size.height + LITTLE_SPACE;//
CGFloat keyboardHeight = keyboardSize.height;
BOOL isTextFieldHidden = textFieldBottomLine > (viewRect.size.height - keyboardHeight)? TRUE :FALSE;
if (isTextFieldHidden) {
animatedDistance = textFieldBottomLine - (viewRect.size.height - keyboardHeight) ;
viewFrame.origin.y -= animatedDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
return YES;
}
-(void) restoreViewFrameOrigionYToZero{
CGRect viewFrame = self.view.frame;
if (viewFrame.origin.y != 0) {
viewFrame.origin.y = 0;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
}
-(void)keyboardDidShow:(NSNotification*)aNotification{
NSDictionary* info = [aNotification userInfo];
keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
}
-(void)keyboardDidHide:(NSNotification*)aNotification{
[self restoreViewFrameOrigionYToZero];// keyboard is dismissed, restore frame view to its zero origin
}
@end
Ответ 25
@mixca ответ очень полезен, но что, если у меня что-то отличное от UITextField. Я думаю, что лучший способ справиться с этим, выполнив поиск всех подзонов основного представления с помощью рекурсивной функции, посмотрите пример ниже
- (BOOL)findAndResignFirstResponder {
if (self.isFirstResponder) {
[self resignFirstResponder];
return YES;
}
for (UIView *subView in self.subviews) {
if ([subView findAndResignFirstResponder]) {
return YES;
}
}
return NO;
}
а также вы можете поместить этот метод в свой класс утилит и можете использовать из жестов tap, например, @mixca answer..
Ответ 26
UITableView
имеет удобное свойство backgroundView
, с которым я достиг такого поведения, не возившись с выбором ячейки, как показано ниже в Swift:
let tableBackTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
tableView.backgroundView = UIView()
tableView.backgroundView?.addGestureRecognizer(tableBackTapRecognizer)
Ответ 27
Попробуй это:
viewDidLoad(){
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
tableView.addGestureRecognizer(tap)
}
//Calls this function when the tap is recognized.
@objc func dismissKeyboard() {
//Causes the view (or one of its embedded text fields) to resign the first responder status.
view.endEditing(true)
}