Question

Je joins un UISwipeGestureRecognizer à un 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 de didSwipe est toujours obtenir appelé deux fois sur coup réussi. Je pensais d'abord c'était parce que le geste commence et se termine, mais si je me connecte le gestureRecognizer lui-même, ils sont tous les deux dans l'état « composition non limitée »:

-(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 vraiment ne sais vraiment pas pourquoi. Je vérifiais essayé évidemment de l'état Ended, mais ce n'est pas l'aide qu'ils viennent tous deux en tant que « terminé » quand même ... Des idées?

Était-ce utile?

La solution

Au lieu d'ajouter le geste à la cellule de reconnaissance directement, vous pouvez l'ajouter à la tableview dans viewDidLoad.

Dans la didSwipe méthode, vous pouvez déterminer la indexPath affectée et cellule 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];
        // ...
  }
}

Autres conseils

Il travaillera avec délégué app

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

// code

}

J'ai eu ce même problème et résolu en cochant la case « Activé Scrolling » dans les attributs de tableau.

Mon point de vue de la table n'a pas besoin de défilement, de sorte qu'il ne modifie pas l'application de toute autre manière, sauf que maintenant je ne reçois pas la première prise ne répond plus après un geste de balayage.

Ajout geste 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")
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top