2012-02-20 18 views
7

Quiero dos interacciones en una celda de vista de tabla: toque normal y mantenga presionada. He utilizado la respuesta a la siguiente para ayudarme a empezar:gesto de pulsación larga en la celda de vista de tabla

Long press on UITableView

El problema con esto es que si hago una pulsación larga en una célula válida, la célula destacará azul, y el gesto pulsación larga hace no disparar (cree que es solo un simple toque). Sin embargo, si comienzo el gesto de presión prolongada en una celda no válida, luego deslizo mi dedo hacia una celda válida y luego lo suelto, funciona bien.

+1

¿Qué es una "celda inválida" según su definición? – omz

+0

Creo que es "sin necesidad de celda" –

Respuesta

-2

deshabilitar Tal vez la selección de IB o programáticamente

[cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
+0

¿Esto simplemente desactiva el resaltado azul? – user1120008

+0

Mi teoría es que su gesto de presión prolongada no se dispara porque la celda ya está resaltada. Por favor, prueba mi propuesta, no perderás nada. –

+0

No tuve suerte con ese enfoque. – user1120008

23

es probable que haya una mejor respuesta por ahí, pero aquí es una manera de hacerlo:

En primer lugar crear un reconocedor gesto pulsación larga de la tabla ver a sí mismo.

UILongPressGestureRecognizer* longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onLongPress:)]; 
[self.tableView addGestureRecognizer:longPressRecognizer]; 

Entonces, manejarlo con una rutina que puede encontrar la fila seleccionada:

-(void)onLongPress:(UILongPressGestureRecognizer*)pGesture 
{ 
if (pGesture.state == UIGestureRecognizerStateRecognized) 
{ 
    //Do something to tell the user! 
} 
if (pGesture.state == UIGestureRecognizerStateEnded) 
{ 
    UITableView* tableView = (UITableView*)self.view; 
    CGPoint touchPoint = [pGesture locationInView:self.view]; 
    NSIndexPath* row = [tableView indexPathForRowAtPoint:touchPoint]; 
    if (row != nil) { 
     //Handle the long press on row 
    } 
} 
} 

no he probado, pero creo que se podría mantener la fila de mostrar la selección haciendo el gesto los reconocedores en la vista de tabla esperan a que la pulsación larga falle.

2

Me encontré con el mismo problema y encontré una buena solución. (al menos en iOS 7)

Agregue UILongPressGestureRecognizer a la propia celda.

self.longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onSelfLongpressDetected:)]; 
[self addGestureRecognizer:self.longPressGesture]; 

Su raro pero importante iniciar con el objetivo de uno mismo, y también añadir la gestureRecognizer de nuevo a sí mismo y el método onSelfLongpressDetected es llamada.

0

Tuve un problema cerca de esto. Primero traté de agregar un gesto de prensa largo a una UIView dentro de una celda seleccionable y no funcionó. La solución fue agregar el gesto a la celda en sí, como se dijo antes en la respuesta de Fabio.

Adición de la solución en más abajo SWIFT:

let longPress = UILongPressGestureRecognizer.init(target: self, action: #selector(longPress(_:))) 
longPress.minimumPressDuration = 1.0 
cell.addGestureRecognizer(longPress) 

he utilizado el código de seguridad dentro del método cellForRowAtIndexPath UITableViewDataSource.

Cuestiones relacionadas