UITcrollView在UITableViewCell内部 - 没有didSelect调用

时间:2013-02-25 09:09:55

标签: ios objective-c uikit

我有一个tableviewCell,用户可以横向scroll。由于scrollView几乎涵盖整个cell,因此如果用户点击tableView,则didSelectRow方法cell不会被调用。

所以我想,我可以将UIScrollView的触摸事件传递给cell,但仍然会调用didSelectRow。 我将UIScrollView子类化为仅传递触摸事件,如果触摸不是拖动:

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
{
    NSLog(@"touch scroll");
    // If not dragging, send event to next responder
    if (!self.dragging)
        [self.superview touchesEnded: touches withEvent:event];
    else
        [super touchesEnded: touches withEvent: event];
}

关于如何将点击传递到表格,获取调用的委托方法以及保持在scrollview内的滚动的任何想法?

5 个答案:

答案 0 :(得分:16)

实际上,您可以在不继承UIScrollView的情况下执行此操作。无论您是自定义单元格,还是在cellForRowAtIndexPath的{​​{1}}中设置属性,您都可以执行以下操作:

UITableView

你可以这样做的原因是因为scrollView有自己的panGestureRecognizer,程序员可以访问它。因此,只需将其添加到单元格的视图中,就会触发scrollview的手势委托。

此方法的唯一缺点是滚动视图的子视图无法接收任何触摸输入。如果您需要,您将不得不选择不同的方法。

答案 1 :(得分:7)

我刚遇到同样的问题。
在您的子类中,请确保包含完整的方法集:

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

答案 2 :(得分:0)

所选答案是正确的,但我根据我遇到的错误更新了代码。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if (self.dragging) {
        [super touchesMoved:touches withEvent:event];
    } else {
        if ([self.delegate isKindOfClass:[UITableViewCell class]]) {
            [(UITableViewCell *)self.delegate touchesCancelled:touches withEvent:event];
        }

        [self.superview touchesMoved:touches withEvent:event];
    }
}

如果您的self.delegate不是UITableViewCell,请将该属性替换为您的单元格。

单元需要在移动期间检索取消触摸事件以防止不期望的结果。它可以很容易地重现如下。

  • 突出显示单元格(假设滚动视图位于整个单元格上,如果不突出显示滚动视图)
  • 单元格突出显示时,拖动表格视图
  • 选择任何其他单元格,现在之前突出显示的单元格将检索didSelectCell

另一点需要提及的是订单很重要!如果在self.delegate之前未调用self.superview,则突出显示的状态不会发生。

答案 3 :(得分:0)

Swift 3

scrollView.isUserInteractionEnabled = false
contentView.addGestureRecognizer(scrollView.panGestureRecognizer)

答案 4 :(得分:-1)

尝试设置此

_scrollView.canCancelContentTouches = NO

另外,部分转发触摸事件是不好的