Коснитесь событий в UITableView?
У меня есть UIViewController
и UITableView
как дочерний элемент в представлении,
то, что я хочу сделать, это когда я касаюсь любой строки, на которой я показываю снизу. Я хочу скрыть это представление, если пользователь коснется любого другого, кроме строк или нижнего.
Проблема в том, что когда я нажимаю UITableView
, она не запускает событие touchesEnded
.
Теперь, как я могу обнаружить касание UITableView
и отличить его от события выбора строки.
Спасибо.
Ответы
Ответ 1
Я столкнулся с проблемой с давних пор и не получил никакого рабочего решения. Наконец, я решил пойти с альтернативой. Я знаю, что технически это не решение, но это может помочь кому-то точно найти то же самое.
В моем случае я хочу выбрать строку, которая покажет какой-то параметр после того, как я коснусь любой точки таблицы или вида. Я хочу скрыть эти параметры или выполнить любую задачу, кроме ранее выбранной строки, для которой я сделал следующее:
-
Установите события касания для представления. Это выполнит задачу, когда вы касаетесь любого места в представлении, кроме представления таблицы.
-
TableView didSelectRowAtIndexPath выполняет следующие действия
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
if(indexPath.row != previousSelectedRow && previousSelectedRow != -1) {
// hide options or whatever you want to do
previousSelectedRow = -1;
}
else {
// show your options or other things
previousSelectedRow = indexPath.row;
}
}
Я знаю, что это старшая должность, а не хорошее техническое решение, но это сработало для меня. Я отправляю этот ответ, потому что это может помочь кому-то точно.
Примечание. В коде, написанном здесь, могут быть ошибки заклинания, потому что они непосредственно введены здесь.:)
Ответ 2
Нет необходимости подклассифицировать что-либо, вы можете добавить UITapGestureRecognizer
в UITableView
и принять жест или нет в зависимости от ваших критериев.
В вашем представленииDidLoad:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapOnTableView:)];
[self.myTableView addGestureRecognizer:tap];
Затем выполните следующие действия для этого критерия:
-(void) didTapOnTableView:(UIGestureRecognizer*) recognizer {
CGPoint tapLocation = [recognizer locationInView:self.myTableView];
NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:tapLocation];
if (indexPath) { //we are in a tableview cell, let the gesture be handled by the view
recognizer.cancelsTouchesInView = NO;
} else { // anywhere else, do what is needed for your case
[self.navigationController popViewControllerAnimated:YES];
}
}
И обратите внимание, что если вы просто хотите просто забрать клики в любом месте таблицы, но не на каких-либо кнопках в строках ячеек, вам нужно использовать только первый фрагмент кода выше. Типичный пример - когда у вас есть UITableView, а также UISearchBar. Вы хотите удалить панель поиска, когда пользователь нажимает, прокручивает и т.д. Вид таблицы. Пример кода...
-(void)viewDidLoad {
[super viewDidLoad];
etc ...
[self _prepareTable];
}
-(void)_prepareTable {
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.tableView.allowsSelection = NO;
etc...
UITapGestureRecognizer *anyTouch =
[[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(tableTap)];
[self.tableView addGestureRecognizer:anyTouch];
}
// Always drop the keyboard when the user taps on the table:
// This will correctly NOT affect any buttons in cell rows:
-(void)tableTap {
[self.searchBar resignFirstResponder];
}
// You probably also want to drop the keyboard when the user is
// scrolling around looking at the table. If so:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
[self.searchBar resignFirstResponder];
}
// Finally you may or may not want to drop the keyboard when
// a button in one cell row is clicked. If so:
-(void)clickedSomeCellButton... {
[self.searchBar resignFirstResponder];
...
}
Надеюсь, что это поможет кому-то.
Ответ 3
Вы должны переслать событие касания на контроллер вида.
Подкласс для управления таблицей и последующим переопределением метода:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event]; //let the tableview handle cell selection
[self.nextResponder touchesBegan:touches withEvent:event]; // give the controller a chance for handling touch events
}
тогда вы можете делать то, что хотите, в методах сенсорного управления.
Ответ 4
Я просто наткнулся на то, что может быть решением вашей проблемы. Используйте этот код при создании табличного представления:
tableView.canCancelContentTouches = NO;
Без установки этого параметра на NO
события касания отменятся, как только в вашем представлении таблицы наблюдается небольшое перемещение по вертикали (если вы поместите инструкции NSLog в свой код, вы увидите, что touchesCancelled
вызывается, как только таблица начинает прокручивать по вертикали).
Ответ 5
Попробуйте следующие методы:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
}
Используйте scrollViewDidEndDragging как альтернативу touchesEnded. Надеюсь, что это поможет.
Ответ 6
Для получения событий касания на UITableView
используйте:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//<my stuff>
[super touchesBegan:touches withEvent:event];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
//<my stuff>
[super touchesMoved:touches withEvent:event];
}
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
//<my stuff>
[super touchesEnded:touches withEvent:event];
}
- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
//<my stuff>
[super touchesCancelled:touches withEvent:event];
}
получать события касания в UITableView
Ответ 7
В классе контроллера объявите метод, который удаляет нижний вид. Что-то вроде этого:
-(IBAction)bottomViewRemove:(id)sender {
[bottomView removeFromSuperview];
}
В Interface Builder выберите свое представление и в инспекторе идентификации в разделе пользовательского класса, измените класс с UIView
на UIControl
. После этого перейдите к инспектору соединений и подключите событие TouchUpInside к описанному выше методу. Надеюсь, это поможет.