Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Touch events on UITableView?

I have UIViewControllerand UITableView as child in the view, what I want to do is when I touch any row I am displaying a view at bottom. I want to hide that view if the user touch any where else then rows or the bottomView.

The problem is when I click on UITableView it doesn't fires touchesEnded event.

Now how can I detect touch on UITableView and distinguish it with row selection event.

Thanks.

like image 760
Kapil Choubisa Avatar asked May 01 '11 12:05

Kapil Choubisa


1 Answers

No need to subclass anything, you can add a UITapGestureRecognizer to the UITableView and absorb the gesture or not depending on your criteria.

In your viewDidLoad:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapOnTableView:)]; [self.myTableView addGestureRecognizer:tap]; 

Then, implement your action like this for the criteria:

-(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];     } } 

And note that if you just want to simply pick up clicks anywhere on the table, but not on any buttons in cell rows, you need only use the first code fragment above. A typical example is when you have a UITableView and there is also a UISearchBar. You want to eliminate the search bar when the user clicks, scrolls, etc the table view. Code example...

-(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];     ... } 

Hope it helps someone.

like image 176
David Avatar answered Sep 22 '22 04:09

David