44 votes

Problème UIGestureRecognizer et UITableViewCell

Je joins une UISwipeGestureRecognizer à un UITableViewCell dans le cellForRowAtIndexPath: méthode comme suit:

- (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 didSwipe méthode est toujours appelé deux fois sur le succès de balayage. J'ai d'abord pensé que c'était parce que le geste commence et se termine, mais si je me déconnecte, le gestureRecognizer lui-même, ils sont tous les deux dans le "Fini" de l'état:

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

Vraiment, je ne sais pas vraiment pourquoi. J'ai essayé évidemment vérifier le Clos de l'état, mais qui n'est d'aucune aide, car ils viennent en "Terminé" de toute façon... des idées?

109voto

phix23 Points 24407

Au lieu d’ajouter directement le dispositif de reconnaissance des gestes à la cellule, vous pouvez l’ajouter à la vue table sous la forme 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];
        // ...
  }
}
 

0voto

Kumaresan Points 57

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

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

// code

}
 

0voto

Mark C Mitchell Points 21

J'ai eu le même problème et je l'ai résolu en cochant "Défilement activé" 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 d'une autre manière, sauf que je ne reçois plus le premier tap qui ne répond pas après un geste de balayage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X