трогаетБеган не отвечает - PullRequest
3 голосов
/ 06 марта 2012

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

У меня есть UIView, который содержит TableView, и у меня есть следующееmethod:

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

NSLog(@"See a tap gesture");
UITouch *touch = [touches anyObject];
if(touch.phase==UITouchPhaseBegan){
    //find first response view
    for (UIView *view in [self.view subviews]) {
        if ([view isFirstResponder]) {
            [view resignFirstResponder];
            break;
        }
    }
}


[super touchesBegan:touches withEvent:event];

}

В моем self.view и моем self.tableView обоим userInteractionEnabled установлено значение YES, но по какой-то причине touchesBegan никогда не запускается.Есть идеи?

Ответы [ 4 ]

2 голосов
/ 06 марта 2012

Если ваш UIView содержит ваш UITableView, то табличное представление находится наверху цепочки респондента, и сенсорные события не попадут в ваш взгляд. Но может быть лучший способ сделать это. Что ты после?

UPDATE

Реализация UITextFieldDeletate 'textFieldShouldReturn: метода для перехвата нажатия' Return ':

-(BOOL)textFieldShouldReturn:(UITextField *)textField {
   [textField resignFirstResponder];
   return YES;
}

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

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

Moar

Хорошо, достаточно справедливо, но все становится сложным, когда вы перехватываете события касания с помощью составных прозрачных представлений (это может также дорого обойтись) и так далее. И вы никогда не знаете последствий, которые могут возникнуть в будущем, не только для пользователя, но и для вас, программиста, когда вы захотите обновить приложение в будущем.

Почему бы не сделать это простым? Как насчет просто «Готово» UIBarButtonItem или небольшого полупрозрачного UIToolbar, которое скользит вверх по клавиатуре / сборщику аля Mobile Safari? Эти решения приемлемы для пользователя и могут облегчить его жизнь. Они, безусловно, облегчают разработку, разделяя артефакты и функциональность на модульные блоки.

Одна заключительная нота

Использование UITapGestureRecognizer Я думаю, что будет трудно разобраться в вашей ситуации. Я обеспокоен тем, что любой распознаватель касаний, который вы добавляете в представление таблицы, будет препятствовать таким вещам, как выбор строки или перемещение элемента управления в другой элемент пользовательского интерфейса (текстовое поле, переключатель и т. Д.).

0 голосов
/ 06 марта 2012

Я реализовал похожую функциональность в одном из своих приложений, я использовал textFields, а не textViews, но он все равно должен работать.Я использовал

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [textField reresignFirstResponder];
}

Без каких-либо проверок, если пользователь нажимает вызывается метод resignFirstResponder, но если пользователь нажимает на textView, то это снова вызывает его, чтобы стать первым респондентом, в результате чего не видноменять.Я реализовал эту концепцию в приложении с 9 текстовыми полями в одном представлении, и у меня еще не возникло проблем.

0 голосов
/ 06 марта 2012

Попробуйте добавить распознаватель жестов касания к представлению таблицы. Таким образом, вы сможете разрешить нормальное поведение, а также захват события tap для выполнения дополнительных действий.

0 голосов
/ 06 марта 2012

Убедитесь, что вы установили объект для обработки этих событий касания:

[myButton addTarget:self action:@selector(buttonTouch:withEvent:) forControlEvents:UIControlEventTouchUpInside];

А затем обработайте событие касания в объявленном вами методе:

- (IBAction) buttonTouch:(id) sender withEvent:(UIEvent *) event

Обновлено для UIView (при условии, что у вас уже есть розетка, созданная и подключенная):

[myView addTarget:self action:@selector(myTouchEvent:withEvent:) forControlEvents:UIControlEventTouchUpInside];

А потом:

- (IBAction) myTouchEvent:(id) sender withEvent:(UIEvent *) event

Теперь, когда я понимаю, что вы пытаетесь сделать (отклонить клавиатуру при касании за пределами текстового поля), существует простое решение, которое хорошо работает практически в каждом сценарии).

Шаг 1. Создайте кнопку, размер которой соответствует размеру представления, в котором находится TableViewController. (Большая кнопка). Шаг 2 - Отправьте эту кнопку назад (Editor-> Arrange-> Send to Back) Шаг 3 - Подключите IBAction к этой кнопке и назовите ее dismissKeyboardButtonPressed (подсказка, если вы еще не используете редактор-помощник, вам следует это сделать) Шаг 4 - Внутри метода IBAction (при условии, что ваш TextField называется myTextField):

[myTextField resignFirstResponder];

Шаг 5 - Запустите его. Всякий раз, когда вы касаетесь в любом месте вида за пределами текстового поля, клавиатура отклоняется.

Это метод, который я использую почти каждый раз, когда я помещаю TextField в представление, и мне нужно игнорировать КБ при касании за пределами TextField.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...