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.