Iphone Textview не вызывает TouchesBegan

У меня есть текстовое поле, которое скрывает клавиатуру, когда я касаюсь другого места на экране (через мою функцию TouchesBegan и уходит в отставку... бла). Но когда я касаюсь Textview, TouchesBegan не вызывается, и клавиатура не скрывается! Есть ли способ вызвать TouchesBegan, чтобы скрыть клавиатуру?


person Exegesis    schedule 16.11.2010    source источник
comment
Вы хотите скрыть клавиатуру, когда пользователь нажимает на весь экран, включая текстовый файл?   -  person Elf Sundae    schedule 14.08.2013


Ответы (3)


Также есть простой способ скрыть клавиатуру на touchesBegan: когда вы используете UITextView для ввода данных.

Шаг 1. Убедитесь, что вы расширили Textviewdelegate при объявлении класса.

@interface YourClassName : UIViewController { IBOutlet UITextView *txtMyView; }

Шаг 2. Установите для делегата значение self in view, загрузив функцию.

- (void)viewDidLoad
{
    txtMyView.delegate = self;
}

Шаг 3. Напишите аналогичный код в функции touchesbegan с вашим именем textView.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
            [txtMyView resignFirstResponder];
        [super touchesBegan:touches withEvent:event];

}

Спасибо и привет.

person Amitesh Kumar    schedule 22.11.2010
comment
Я попробовал этот метод, но мое текстовое представление никогда не вызывало touchesBegan ... только касание меток / пустого пространства начинало работать касаниями: O. - person Exegesis; 25.11.2010

Я предполагаю, что ваш UITextView не редактируется, так как вы не хотите, чтобы клавиатура появлялась при касании, поэтому убедитесь, что в свойствах просмотра для вашего UITextView не установлен флажок «Взаимодействие с пользователем включено». Вы также можете написать это в своем ViewController как таковое:

textView.userInteractionEnabled = NO;

Это позволит пользовательским событиям проходить в суперпредставление, и будут вызываться touchesBegan и другие методы делегата.

person TooDiesel    schedule 14.08.2013
comment
userInteractionEnabled = false у меня не работает - person János; 12.11.2014
comment
Это сработало для меня. Когда установлено textView.userInteractionEnabled = false, касания отправляются в его супервизор. - person Imran; 09.04.2021

Лучший способ, который я видел для этого, - добавить прозрачное подпредставление, которое перекрывает текстовое представление и сначала обрабатывает TouchesBegan. Затем вы можете обнаруживать прикосновения за пределами текстового поля и отключать клавиатуру, заставляя текстовое поле уйти в отставку в качестве первого ответчика.

Например, создайте подпредставление оверлея в IB или программно, в любом случае. Разместите и измените его размер так, чтобы он закрывал текстовые представления, и задайте ему четкий цвет. Если вы добавляете представление через IB, скройте его при загрузке основного представления, чтобы оно пока не поглощало прикосновения, например:

- (void)viewDidLoad
{
    [super viewDidLoad];
    overView.hidden = YES;
}

Затем, когда текстовое поле начнет редактироваться, отобразите вид:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    overView.hidden = NO;
}

Когда текстовое поле завершит редактирование, снова скройте вид:

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    overView.hidden = YES;
}

Добавьте touchesBegan для обнаружения прикосновения к вашему скрытому overView:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    // Resign first responder if touch is outside text field
    if ([touch view] != myTextField)
        [myTextField resignFirstResponder];

    // Send touches up the responder chain (pass them through)
    [self.nextResponder touchesBegan:touches withEvent:event];
}

Вы также можете сделать это с помощью пользовательских жестов, но это работает только с iOS 4.x и, на мой взгляд, сложнее.

person spstanley    schedule 16.11.2010