У меня есть текстовое поле, которое скрывает клавиатуру, когда я касаюсь другого места на экране (через мою функцию TouchesBegan и уходит в отставку... бла). Но когда я касаюсь Textview, TouchesBegan не вызывается, и клавиатура не скрывается! Есть ли способ вызвать TouchesBegan, чтобы скрыть клавиатуру?
Iphone Textview не вызывает TouchesBegan
Ответы (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];
}
Спасибо и привет.
Я предполагаю, что ваш UITextView не редактируется, так как вы не хотите, чтобы клавиатура появлялась при касании, поэтому убедитесь, что в свойствах просмотра для вашего UITextView не установлен флажок «Взаимодействие с пользователем включено». Вы также можете написать это в своем ViewController как таковое:
textView.userInteractionEnabled = NO;
Это позволит пользовательским событиям проходить в суперпредставление, и будут вызываться touchesBegan и другие методы делегата.
userInteractionEnabled = false
у меня не работает
- person János; 12.11.2014
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 и, на мой взгляд, сложнее.