Отключить клавиатуру, прикоснувшись к фону UITableView - PullRequest
100 голосов
/ 23 февраля 2010

У меня есть UITableView с UITextField с в качестве ячеек. Я хотел бы отклонить клавиатуру при прикосновении к фону UITableView. Я пытаюсь сделать это, создав UIButton размер UITableView и поместив его позади UITableView. Единственная проблема заключается в том, что UIButton ловит все касания, даже когда касание находится на UITableView. Что я делаю не так?

Спасибо!

Ответы [ 27 ]

197 голосов
/ 09 ноября 2010

Это легко сделать, создав объект 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 внутри ячеек и т. Д.

124 голосов
/ 18 января 2011

Решение UITapGestureRecognizer работает с выбором ячеек таблицы, если вы установите:

gestureRecognizer.cancelsTouchesInView = NO;
61 голосов
/ 29 февраля 2012

Вот лучший способ сделать это. Просто сделай это

[self.view endEditing:YES];

или

[[self.tableView superView] endEditing:YES];
51 голосов
/ 25 января 2016

Вы также можете сделать это из раскадровки: enter image description here

22 голосов
/ 14 мая 2013

Поскольку UITableView является подклассом UIScrollView, реализация одного метода делегата, представленного ниже, обеспечивает чрезвычайно простое и быстрое решение. Нет необходимости даже привлекать resignFirstResponder, так как просмотр иерархии анализирует и находит текущего респондента и просит его отказаться от своего статуса респондента.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}

И не забудьте добавить UIScrollViewDelegate в заголовочный файл.

13 голосов
/ 30 июня 2011

Во-первых, прослушайте 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]; 

}

Надеюсь, это поможет любому, кто ищет !!

9 голосов
/ 28 июля 2016
tableView.keyboardDismissMode = .onDrag
7 голосов
/ 02 октября 2015

Вот быстрая версия для вашего удовольствия от кодирования:

Добавляет распознаватель жестов касания, а затем закрывает клавиатуру. Выход для 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
}
7 голосов
/ 23 февраля 2010

Я сделал это так:

Создайте метод в вашем 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];
    ...
}
6 голосов
/ 30 октября 2017

Существует версия Swift 3 без блокирования нажатий на ячейки.

В viewDidLoad() метод:

let dismissKeyboardGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
dismissKeyboardGesture.cancelsTouchesInView = false
tableView.addGestureRecognizer(dismissKeyboardGesture)

И hideKeyboard выглядит так:

func hideKeyboard() {
    view.endEditing(true)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...