ios uitableview uiscrollview didselectrowatindexpath

ios - didSelectRowAtIndexPath no se llama



uitableview uiscrollview (3)

Estoy agregando UIScrollView en UITableViewCell, pero cuando hago clic en la vista de desplazamiento seleccioné el método que no se está llamando.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Estoy agregando la vista de desplazamiento en la vista de contenido de la celda, todavía no está llamando el método de selección.

[cell.contentView addSubview:scrollView];


Debido a que scrollView se superpone a la celda ... La mejor manera es agregar toque Gestionar en UIScrollView , por ejemplo,

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)]; [recognizer setNumberOfTapsRequired:1]; MYScrollView.userInteractionEnabled = YES; [MYScrollView addGestureRecognizer:recognizer];

Agregue el código anterior en el método cellForRowAtIndexPath y el método de acción Write gesture, como por ejemplo

-(void)gestureAction:(UITapGestureRecognizer *) sender { CGPoint touchLocation = [sender locationOfTouch:0 inView:self.YourTableViewName]; NSIndexPath *indexPath = [self.YourTableViewName indexPathForRowAtPoint:touchLocation]; NSLog(@"%d", indexPath.row); }

Aquí, en el método de gesto (acción) anterior , puede obtener indexPath misma manera que didSelectRowAtIndexPath .


La razón por la que su celda de tabla no puede detectar los toques se debe a que scrollView en su celda está interceptando los toques y no los está transportando a la celda de la tabla para que se pueda llamar a la función de delegado tableView.

Una solución más simple es simplemente crear una subclase de UIScrollView y establecer el scrollView en su celda a esta subclase. anular estos métodos en la subclase scrollview

-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { if (!self.dragging) [self.superview touchesCancelled: touches withEvent:event]; else [super touchesCancelled: touches withEvent: event]; } -(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { if (!self.dragging) [self.superview touchesMoved: touches withEvent:event]; else [super touchesMoved: touches withEvent: event]; } -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (!self.dragging) [self.superview touchesBegan: touches withEvent:event]; else [super touchesBegan: touches withEvent: event]; } -(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (!self.dragging) [self.superview touchesEnded: touches withEvent:event]; else [super touchesEnded: touches withEvent: event]; }

Que básicamente verifica si la vista de desplazamiento se está arrastrando, y si no es así pasa todos los eventos táctiles a su supervista, en este caso la vista de contenido de la celda.

Esto me solucionó un problema similar, espero que esto ayude.

Aclamaciones.


Swift 2

class UIScrollViewSuperTaps: UIScrollView { override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { if self.dragging { super.touchesBegan(touches, withEvent: event) } else { self.superview?.touchesBegan(touches, withEvent: event) } } override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) { if self.dragging { super.touchesCancelled(touches, withEvent: event) } else { self.superview?.touchesCancelled(touches, withEvent: event) } } override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { if self.dragging { super.touchesEnded(touches, withEvent: event) } else { self.superview?.touchesEnded(touches, withEvent: event) } } override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { if self.dragging { super.touchesMoved(touches, withEvent: event) } else { self.superview?.touchesMoved(touches, withEvent: event) } } }

Swift 3

class UIScrollViewSuperTaps: UIScrollView { override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { if self.isDragging { super.touchesBegan(touches, with: event) } else { self.superview?.touchesBegan(touches, with: event) } } override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { if self.isDragging { super.touchesCancelled(touches, with: event) } else { self.superview?.touchesCancelled(touches, with: event) } } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { if self.isDragging { super.touchesEnded(touches, with: event) } else { self.superview?.touchesEnded(touches, with: event) } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if self.isDragging { super.touchesMoved(touches, with: event) } else { self.superview?.touchesMoved(touches, with: event) } } }

No olvide asignar la clase UIScrollViewSuperTaps a su vista de desplazamiento en el guión gráfico o en el código, según cómo lo haya creado.