如何在自定义TableViewCell内的UIView Tap上禁用didSelectRowAtIndexPath?

时间:2015-06-02 05:29:27

标签: ios objective-c uitableview uiview

我在自定义UITableView中有自定义TableViewCell的{​​{1}},其中有UITableViewCellUIView)。我想点击myView时要停用didSelectRowAtIndexPath,点击myView时不应调用didSelectRowAtIndexPath

它与this question不同,因为在那个问题中,用户想要达到的目标并不清楚,答案也不同。

enter image description here

2 个答案:

答案 0 :(得分:4)

您可以覆盖UITableViewCell的pointInside,试试这个:

// MyCell.m
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    BOOL pointInside = [super pointInside:point withEvent:event];

    if (pointInside && ![self.myView pointInside:[self convertPoint:point toView:self.myView] withEvent:event]) {
        return YES;
    }

    return NO;
}
当你点击myView

时,不会调用

didSelectRowAtIndexPathshould

答案 1 :(得分:2)

根据the Responder Chain

  

iOS使用点击测试来查找触摸下的视图。命中测试涉及检查触摸是否在任何相关视图对象的范围内。如果是,则以递归方式检查该视图的所有子视图。包含触摸点的视图层次结构中的最低视图将成为命中测试视图。在iOS确定命中测试视图后,它会将触摸事件传递给该视图以进行处理   
在图像打击中:

(图2-1命中测试返回被触摸的子视图)  enter image description here

为了说明,假设用户触摸图2-1中的视图E. iOS通过按以下顺序检查子视图来查找命中测试视图:

  1. 触摸位于视图A的范围内,因此它会检查子视图B. 和C.
  2. 触摸不在视图B的范围内,但它在视图范围内 视图C的边界,因此它检查子视图D和E.
  3. 触摸不在视图D的范围内,但它在视图范围内 视图边界E.视图E是视图层次结构中的最低视图 它包含触摸,因此它成为命中测试视图。
  4. 正如大多数应用程序所做的那样,不需要禁用didSelectRowAtIndexPath函数的执行。你可以在这里做的,就是在myView上添加UIButton或添加UITapGesture并执行所需的任务,当你触摸UITapGesture区域,didSelectRowAtIndexPath将无法执行。 就像这样:

    enter image description here