wake-up-neo.com

UIGestureRecognizer- und UITableViewCell-Problem

Ich füge eine UISwipeGestureRecognizer an eine UITableViewCell in der cellForRowAtIndexPath:-Methode an:

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

Die Methode didSwipe wird jedoch bei erfolgreichem Swipe immer zweimal aufgerufen. Ich dachte zunächst, dass dies darauf zurückzuführen ist, dass die Geste beginnt und endet, aber wenn ich den GestureRecognizer selbst abmelde, befinden sich beide im Zustand "Ended":

-(void)didSwipe:(UIGestureRecognizer *)gestureRecognizer {

    NSLog(@"did swipe called %@", gestureRecognizer);
}

Konsole:

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>

Ich weiß wirklich nicht warum. Ich habe natürlich versucht, nach dem Ended-Status zu suchen, aber das ist keine Hilfe, da beide sowieso als "Ended" erscheinen ... Irgendwelche Ideen?

43
mootymoots

Anstatt die Gestenerkennung direkt zur Zelle hinzuzufügen, können Sie sie in viewDidLoad zur Tabellenansicht hinzufügen.

In der didSwipe- Methode können Sie den betroffenen IndexPath und die betroffene Zelle folgendermaßen bestimmen:

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

Es wird mit dem App-Delegierten funktionieren

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

// code

}
0
Kumaresan P

Ich hatte das gleiche Problem und löste es, indem ich in den Attributen der Tabellensicht "Scrolling Enabled" anklickte.

Meine Tabellenansicht muss nicht gescrollt werden, daher hat sie keine Auswirkungen auf die App, außer dass ich jetzt nach einer Wischgeste nicht das erste nicht reagierende Antippen bekomme.

0
Mark C Mitchell

Das Hinzufügen von Gesten in der AwakeFromNib-Methode funktioniert problemlos.

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