2011-01-05 18 views
43

Adjunto una UISwipeGestureRecognizer a un UITableViewCell en el método cellForRowAtIndexPath: así:UIGestureRecognizer y emisión UITableViewCell

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

Sin embargo, el método didSwipe está consiguiendo siempre llama dos veces en el golpe exitoso. Al principio pensé que esto era porque el gesto comienza y termina, pero si me conecto a cabo el propio gestureRecognizer, ambos se encuentran en el estado "Finalizada":

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

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

Consola:

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> 

Realmente realmente no sé por qué Traté obviamente de verificar el estado final, pero eso no es de ayuda, ya que ambos entran como "Terminado" de todos modos ... ¿Alguna idea?

Respuesta

109

En lugar de agregar el reconocedor de gestos a la celda directamente, puede agregarlo a la vista de tabla en viewDidLoad.

En el didSwipe -Método se puede determinar el IndexPath y célula afectada de la siguiente manera:

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

Gracias! ¡Eso evitó que disparara dos veces! :) – mootymoots

+0

Gracias, esto ayudó, pero estoy viendo algo extraño: después de deslizar, necesito presionar dos veces si quiero seleccionar la fila. La primera vez no hace nada, y las segundas llamadas didSelectRow ... ¿Alguien ha visto esto? –

+1

@OdedBenDov Creo que es causado por el reconocimiento de gestos, tuve el comportamiento extraño para la selección de celda de vista de tabla cuando agregué el reconocedor de toques y olvidé eliminar en el método de edición final del campo de texto (subvista de la celda de vista de tabla), ser esto puede actuar como una pista para resolver su problema, más detalles [aquí] (http://stackoverflow.com/questions/9939509/strange-behavior-did-select-row-touch-not-responding-for-uitableviewcell) –

0

Se trabajará con delegado de la aplicación

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

// code 

} 
+2

delegado de la aplicación? hm? – quantumpotato

+0

delegado de TableView –

0

Tuve este mismo problema y lo resolvió marcando "Desplazamiento habilitado" en los atributos de vista de tabla.

Mi vista de tabla no necesita desplazamiento, por lo que no afecta a la aplicación de ninguna otra forma, excepto que ahora no obtengo el primer toque que no responde después de un gesto de deslizamiento.

Cuestiones relacionadas