Скрыть клавиатуру при касании за пределами текстового поля

Я пытаюсь скрыть клавиатуру после касания в любом другом месте экрана. Код, который я использую, основан на этом ответе здесь.

IBOutlet UITextView *myTextView;

И метод:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches] anyObject];
    if ([myTextView isFirstResponder] && [touch view] != myTextView) {
        [myTextView resignFirstResponder];
    }
    [super touchesBegan:touches withEvent:event];
}

Чего я не понимаю, так это того, как я должен связать свой UITextField с методом touchesBegan. Какое отправленное событие мне нужно использовать? Кроме того, не должен ли этот метод быть IBAction, потому что сейчас я не могу подключить к нему свой UITextField.

Я также попробовал этот код, но тот сломался мои кнопки навигации (даже с решением, упомянутым в комментариях)


person Community    schedule 01.09.2012    source источник


Ответы (4)


как я должен связать свой UITextField с методом touchesBegan. Какое отправленное событие мне нужно использовать? Кроме того, не должен ли этот метод быть IBAction, потому что сейчас я не могу подключить к нему свой UITextField.

Потому что вы этого не сделаете. Вы должны переопределить этот метод, в представлении которого текстовое поле является подпредставлением.

person Community    schedule 01.09.2012
comment
Я не понимал, что переопределяю метод. Спасибо! - person ; 01.09.2012
comment
@ H2CO3 Это будет означать, что нам придется создать подкласс представления ... Есть ли способ без подкласса ..? - person Ankit Srivastava; 01.09.2012
comment
Я не подклассифицирую его, он работает нормально. Я реализую UIViewController, хотя.. - person ; 01.09.2012

Цель С:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     [[self view] endEditing:YES];
}

Быстрый:

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    self.view.endEditing(true)
}

Это лучший способ, который я нашел, и он очень прост.

person DirectX    schedule 01.09.2012
comment
+1 Не требует селекторов, поэтому работает для нескольких входов. - person danwild; 25.05.2013

Что я делаю, так это меняю общий класс UIView на UIControl. введите здесь описание изображения

Это дает вам событие touchDown, которое вы можете связать с методом resignFirstResponder. введите здесь описание изображения
UIControl по-прежнему предоставляет вам все функции UIView.

-(IBAction)backgroundTap:(id)sender
{
    [text1 resignFirstResponder];
    [text2 resignFirstResponder];
    [textLogin resignFirstResponder];
    [textPassword resignFirstResponder];
} // Resign all responders
person Darren    schedule 01.09.2012
comment
лучший, но как мы можем сделать это программно? - person Vaibhav Saran; 22.01.2013
comment
Вместо добавления UIView к контроллеру добавьте UIControl. - person Darren; 22.01.2013
comment
Это решение просто FAB! - person Shikha Sharma; 16.01.2017

Попробуйте быстрый и грязный способ:

Возьмите кнопку и свяжите ее с методом действия (давайте назовем его Background). Растяните кнопку так, чтобы она закрывала весь вид. Настройте слои представлений так, чтобы только то, с чем пользователь взаимодействует касанием, находилось поверх кнопки. Измените тип кнопки на пользовательский, это сделает кнопку невидимой. Отклоните firstResponder в методе Background.

person Lost Sorcerer    schedule 01.09.2012
comment
Излишне усложненный и хакерский. Решение OP с помощью но помощи и чистоты, и именно так это и должно быть сделано. -1. - person ; 01.09.2012