Domanda

Vi allego un UISwipeGestureRecognizer ad un UITableViewCell nel metodo cellForRowAtIndexPath: in questo modo:

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

Tuttavia, il metodo è sempre didSwipe sempre chiamato due volte sul colpo di successo. Inizialmente ho pensato che questo era perché il gesto inizia e finisce, ma se accedo il gestureRecognizer in sé, sono entrambi nello stato "Ended":

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

Ho veramente non so perché. Ho provato, ovviamente, controllando per lo stato sbilanciati, ma che è di alcun aiuto in quanto entrambi si rivelano "Ended" comunque ... Tutte le idee?

È stato utile?

Soluzione

Invece di aggiungere il sistema di riconoscimento gesto alla cella direttamente, è possibile aggiungerlo alla Tableview in viewDidLoad.

Nel didSwipe-metodo è possibile determinare l'IndexPath interessata e la cella nel seguente modo:

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

Altri suggerimenti

Si lavorerà con app delegato

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

// code

}

Ho avuto questo stesso problema e risolto contrassegnando "Scorrimento abilitato" negli attributi vista tabella.

La mia vista tabella non ha bisogno di scorrimento, in modo da non influenzare l'applicazione in qualsiasi altro modo, solo che adesso non ho ricevuto il primo rubinetto non risponde dopo un gesto di scorrimento.

L'aggiunta di gesto metodo AwakeFromNib funziona senza problemi.

class TestCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()

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

    @objc func gestureAction() {
        print("gesture action")
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top