2012-03-06 3 views
3

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

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

- (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 , но по какой-то причине TouchBegan никогда не срабатывает. Есть идеи?

+0

Я только что заметил. Если я уменьшу размер моего TableView, я могу щелкнуть его вне (так в моем UIView), и в этом случае он работает. Поэтому проблема заключается в том, когда я нажимаю на tableView. Не знаю, как это сделать. – ChrisTauziet

ответ

1

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

UPDATE

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

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

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

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

Moar

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

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

Последнее замечание

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

+0

Я думаю, что ты прав. (см. мой комментарий к моему собственному сообщению). То, что я хочу сделать, - это скрыть клавиатуру, когда пользователь выйдет за пределы UITextField, который находится в таблицеView. – ChrisTauziet

+0

Добавлено сообщение UPDATE – QED

+0

На самом деле, я уже реализовал textFieldShouldReturn. Я пытаюсь использовать touchhesBegan для других вещей (например, скрывать DatePicker после того, как пользователь закончил выбирать дату). – ChrisTauziet

0

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

[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 - Отправляйте эту кнопку в обратную сторону (Редактор-> Упорядочить-> Передать назад) Шаг 3 - Подключите IBAction к этой кнопке и назовите его rejectKeyboardButtonPressed (подскажите, если вы еще не используете помощника редактора, вы должны быть) Шаг 4 - Внутри метода положить IBAction (если ваш TextField называется MyTextField):

[myTextField resignFirstResponder]; 

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

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

+0

На самом деле я хочу обнаружить, когда пользователь меткает в любом месте в представлении – ChrisTauziet

+0

Обновленный ответ. Он будет работать так же, хотите ли вы отслеживать события касания для View, Button, Label, Image и т. Д. –

+0

вы можете сделать это, используя UITapGestureRecognizer, добавленный к представлению, это хорошая альтернатива. – bontoJR

0

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

+0

Как я могу это сделать? – ChrisTauziet

0

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

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

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

+0

Ну, моя проблема в том, что метод touchsBegan никогда не называется. Он имеет отношение к tableView, но я не могу найти способ справиться с ним – ChrisTauziet

Смежные вопросы