hitTest для отключения клавиатуры, вызывающей странное поведение

Я гуглил, как отключить клавиатуру при прикосновении к пустой области в UITableView в iOS, и есть несколько способов решить эту проблему. Например, при использовании делегата, UITapGestureRecognizer, - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event и - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event.

Я решил взять hitTest, создав подкласс соответствующего класса UIView и переопределив этот метод следующим образом:

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *result = [super hitTest:point withEvent:event];
    [self endEditing:YES];

    return result;
}

Это действительно работает, отключает виртуальную клавиатуру, когда я касаюсь / прокручиваю / прокручиваю / зажимаю ... где-то еще, но появляется другая проблема.

Клавиатура активна или отображается, когда я касаюсь одного объекта UITextField, затем я касаюсь того же объекта UITextField, вот проблема, клавиатура пытается закрыться, но не полностью, где-то в середине она начинает появляться, делая такого рода странная анимация. В большинстве случаев в наших приложениях клавиатура должна оставаться неподвижной, когда мы касаемся одного и того же объекта UITextField. Есть ли хороший и простой способ решить эту проблему?

Решено: Наконец-то я разобрался сам. Благодаря @Wain, благодаря подсказке @Wain. Я проверяю result перед вызовом [self endEditing:YES];. Вот измененный код:

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *result = [super hitTest:point withEvent:event];
    // You can change the following condition to meet your own needs
    if (![result isMemberOfClass:[UITextField class]] && ![result isMemberOfClass:[UITextView class]]) {
        [self endEditing:YES];
    }
    return result;
}

person iBCode    schedule 26.06.2014    source источник
comment
Почему бы вам не проверить, что такое result перед завершением сеанса редактирования?   -  person Wain    schedule 26.06.2014
comment
используйте эту ссылку, это надежда для вас .com/questions/23652079/   -  person Anbu.Karthik    schedule 26.06.2014
comment
или иным образом измените это [self endEditing:YES]; в [self.view endEditing: YES];   -  person Anbu.Karthik    schedule 26.06.2014
comment
@Wain Как проверить, например, является ли result объектом UITextField, вернуться напрямую и пропустить endEditing, можете ли вы описать более подробно?   -  person iBCode    schedule 26.06.2014
comment
@ Anbu.Karthik Ссылка у меня не работает, -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event не работает, если представление является подклассом из UIScrollView. Между тем, я переопределяю этот метод в подклассе UITableView, поэтому это может привести к ошибке, если я заменю [self endEditing:YES]; на [self.view endEditing:YES];, потому что self - это само представление.   -  person iBCode    schedule 26.06.2014
comment
r u используется в режиме прокрутки, если вы используете режим прокрутки, измените его на [self.ScrollView endEditing: YES];   -  person Anbu.Karthik    schedule 26.06.2014
comment
@ Anbu.Karthik Да, это прокрутка. Потому что мой пользовательский класс представления является подклассом UITableView, а UITableView является подклассом UIScrollView. Дело в том, что я переопределяю этот метод в своем пользовательском представлении, а не в каком-либо контроллере представления. Таким образом, [self.scrollView endEditing:YES] вызовет синтаксическую ошибку. Поскольку self указывает на вид, как я уже сказал, self — это сам вид.   -  person iBCode    schedule 26.06.2014


Ответы (2)


Отметьте class из result, чтобы можно было ограничить, когда вы закончите редактирование. Если целью нажатия был редактируемый класс (например, текстовое поле или переключатель), не завершайте сеанс редактирования.

person Wain    schedule 26.06.2014

Согласно ответу @iBCode, если я выбираю одно и то же текстовое поле несколько раз, клавиатура автоматически скрывается и сразу же отображается, чтобы избежать добавления еще одного условия и добавления кода ниже на быстром языке.

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    if let resultView = super.hitTest(point, with: event) {
        if resultView.isMember(of: UITextField.self) ||
            resultView.isKind(of: UITextField.self) ||
            resultView.isMember(of: UITextView.self) ||
            resultView.isKind(of: UITextView.self) {
            return resultView
        }
        if !resultView.isMember(of: UITextField.self) && !resultView.isMember(of: UITextView.self) {
            endEditing(true)
        }
        return resultView
    }
    return nil
}
person Anjaneyulu Battula    schedule 11.03.2019