Frage

Ich bin ein UISwipeGestureRecognizer zu einem UITableViewCell im cellForRowAtIndexPath: Verfahren Anbringen etwa 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;
}

ist jedoch die didSwipe Methode immer zweimal auf erfolgreiche Swipe genannt zu werden. Ich dachte zunächst war dies, weil die Geste beginnt und endet, aber wenn ich die GestureRecognizer sich ausloggen, sie sind beide im „Beendet“ Zustand:

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

ich wirklich wirklich weiß nicht, warum. Ich habe versucht, offensichtlich für den Ended Zustand überprüft, aber das ist keine Hilfe, da sie beide in kommen als „Beendet“ sowieso ... Irgendwelche Ideen?

War es hilfreich?

Lösung

Statt der Zugabe des Gestenerkenner an die Zelle direkt, können Sie es mit dem Tableview in viewDidLoad hinzufügen können.

In der didSwipe-Methode können Sie den betroffenen IndexPath und Zelle bestimmen, wie folgt:

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

Andere Tipps

Es wird mit AppDelegate arbeiten

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

// code

}

Ich hatte das gleiche Problem und löste es durch Ankreuzen „Scrolling Aktiviert“ in der Tabellenansicht Attributen.

Meine Tabellenansicht muss nicht Scrollen, so dass es die App nicht auf anderer Weise nicht beeinträchtigt, es sei denn jetzt habe ich nicht bekommen, den ersten unempfänglich Hahn nach einer Wischgeste.

Hinzufügen Geste in AwakeFromNib Methode funktioniert ohne Probleme.

class TestCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()

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

    @objc func gestureAction() {
        print("gesture action")
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top