Отключите клавиатуру, коснувшись фона 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)

}