web-dev-qa-db-fra.com

Problème UIGestureRecognizer et UITableViewCell

J'attache une UISwipeGestureRecognizer à une UITableViewCell dans la méthode cellForRowAtIndexPath: comme ceci:

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

Cependant, la méthode didSwipe est toujours appelée deux fois après un balayage réussi. Au début, je pensais que c'était parce que le geste commençait et finissait, mais si je déconnecte le gestureRecognizer lui-même, ils sont tous deux dans l'état "Terminé":

-(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>

Je ne sais vraiment pas pourquoi. J'ai évidemment essayé de vérifier l'état Terminé, mais ce n'est pas une aide, car ils viennent tous les deux comme "Terminés" de toute façon ... Des idées?

43
mootymoots

Au lieu d’ajouter directement la reconnaissance de geste à la cellule, vous pouvez l’ajouter à la table dans viewDidLoad.

Dans la méthode didSwipe-, vous pouvez déterminer le chemin IndexPath et la cellule affectés comme suit:

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

Cela fonctionnera avec le délégué de l'application

- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{

// code

}
0
Kumaresan P

J'ai eu ce même problème et je l'ai résolu en cochant "Scrolling Enabled" dans les attributs de la vue tableau.

Mon affichage dans la table n'a pas besoin de défilement. Par conséquent, l'application n'est pas affectée autrement, sauf que je ne reçois plus le premier tap qui ne répond pas après un geste de balayage.

0
Mark C Mitchell

Ajouter un geste dans la méthode AwakeFromNib fonctionne sans problème.

class TestCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()

        let panGesture = UIPanGestureRecognizer(target: self,
                                            action: #selector(gestureAction))
        addGestureRecognizer(panGesture)
    }

    @objc func gestureAction() {
        print("gesture action")
    }
}
0
LembergSun