Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIGestureRecognizer and UITableViewCell issue

I am attaching a UISwipeGestureRecognizer to a UITableViewCell in the cellForRowAtIndexPath: method like so:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {      static NSString *CellIdentifier = @"Cell";      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];     if (cell == nil) {         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];          UISwipeGestureRecognizer *gesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];         gesture.direction = UISwipeGestureRecognizerDirectionRight;         [cell.contentView addGestureRecognizer:gesture];         [gesture release];     }     return cell; } 

However, the didSwipe method is always getting called twice on successful swipe. I initially thought this was because the gesture starts and ends, but if I log out the gestureRecognizer itself, they are both in the "Ended" state:

-(void)didSwipe:(UIGestureRecognizer *)gestureRecognizer {      NSLog(@"did swipe called %@", gestureRecognizer); } 

Console:

2011-01-05 12:57:43.478 App[20752:207] did swipe called <UISwipeGestureRecognizer: 0x5982fa0; state = Ended; view = <UITableViewCellContentView 0x5982c30>; target= <(action=didSwipe:, target=<RootViewController 0x5e3e080>)>; direction = right> 2011-01-05 12:57:43.480 App[20752:207] did swipe called <UISwipeGestureRecognizer: 0x5982fa0; state = Ended; view = <UITableViewCellContentView 0x5982c30>; target= <(action=didSwipe:, target=<RootViewController 0x5e3e080>)>; direction = right> 

I really really don't know why. I tried obviously checking for the Ended state, but that is no help as they both come in as "Ended" anyway... Any ideas?

like image 630
mootymoots Avatar asked Jan 05 '11 13:01

mootymoots


1 Answers

Instead of adding the gesture recognizer to the cell directly, you can add it to the tableview in viewDidLoad.

In the didSwipe-Method you can determine the affected IndexPath and cell as follows:

-(void)didSwipe:(UIGestureRecognizer *)gestureRecognizer {    if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {         CGPoint swipeLocation = [gestureRecognizer locationInView:self.tableView];         NSIndexPath *swipedIndexPath = [self.tableView indexPathForRowAtPoint:swipeLocation];         UITableViewCell* swipedCell = [self.tableView cellForRowAtIndexPath:swipedIndexPath];         // ...   } } 
like image 72
Felix Avatar answered Sep 22 '22 06:09

Felix