【问题标题】:How to disable didSelectRowAtIndexPath on UIView Tap inside custom TableViewCell?如何在自定义 TableViewCell 内的 UIView Tap 上禁用 didSelectRowAtIndexPath?
【发布时间】:2015-06-02 05:29:26
【问题描述】:

我有一个UITableView 和自定义TableViewCell,在那个自定义UITableViewCell 中有一个UIView(myView)。我想在点击myView 时禁用didSelectRowAtIndexPath,在点击myView 时不应调用didSelectRowAtIndexPath

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

【问题讨论】:

  • 您不能禁用didSelectRowAtIndexPath函数的执行。您可以在此处执行的操作在您的myView 上添加UITapGesture 并执行所需的任务。
  • @VijayMasiwal See Bannings 为我回答了它的工作正常

标签: ios objective-c uitableview uiview


【解决方案1】:

你可以覆盖 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

【讨论】:

    【解决方案2】:

    the Responder Chain

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

    图片中:

    (图 2-1 Hit-testing 返回被触摸的子视图)
    (来源:apple.com

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

    1. 触摸在视图 A 的范围内,因此它检查子视图 B 和 C.
    2. 触摸不在视图 B 的范围内,但在 视图 C 的边界,因此它检查子视图 D 和 E。
    3. 触摸不在视图 D 的范围内,但在 视图 E 的边界。视图 E 是视图层次结构中的最低视图 包含触摸,因此它成为命中测试视图。

    与大多数应用程序一样,无需禁用 didSelectRowAtIndexPath 函数的执行。您可以在此处添加UIButton 或在您的 myView 上添加 UITapGesture 并执行所需的任务,当您触摸时UITapGesture 的区域,didSelectRowAtIndexPath 将不会执行。 就像这样:

    【讨论】:

    • 感谢您的解释,正如您所说,我在 myView 中以编程方式创建了一个按钮,并添加了一个操作,但是当我点击该按钮时,它只执行 didSelectRowAtIndexPath 不知道为什么跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2021-09-01
    • 1970-01-01
    相关资源
    最近更新 更多