iOS: 单击 TableCellView 内的视图

iOS: clicking on a view inside a TableCellView

我在 UITableViewCell 里面放了一个小 UIView

目前正在发生的事情是,当我单击 on 视图时,两件事都会发生:弹出窗口打开并且“didSelectRowAtIndexPath”函数被触发。

如何确保当我点击 UIView 时,“didSelectRowAtIndexPath”函数不会被触发?

当前实施:

我在自定义 UITableViewCell class.

中为 UIView 定义了一个 UITapGestureRecognizer

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(MyCustomTableViewCell.clickOnHelp(_:))) myClickAreaUIView.addGestureRecognizer(tapGesture)

尝试将内部视图的 exclusiveTouch 属性 设置为 true

cell.tapView.exclusiveTouch = true

只需在 cellForRowAtIndexPath() 中编写这段代码,因为 select prevent::

cell.selectionStyle = UITableViewCellSelectionStyle.None

我建议像下面那样实现 UIGestureRecognizerDelegate 的以下方法

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    print("in shouldReceiveTouch")
    gestureRecognizer.delegate = self
    if ([...]){ // touch location is in the UIView
        print("touching UIView")
        return false // prevent from forwarding touch to superview
    } else {
        println("touching elsewhere")
        return true
    }
}

您应该使用 UIGestureRecognizerDelegate

中的此方法
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
   return false
}

为您的 UIView 创建一个 customClass 让我们说 CustomView 类型 UIView

连接您的 UIView@IBOutlet 符合类型 CustomView

tableViewCell

CustomViewclass中调用这个函数

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
    super.pointInside(point, withEvent: event)

    return CGRectContainsPoint(self.bounds, point)
}

这将告诉您用户点击的位置是否包含在 UIView 范围内,如果 returns true在你的 UIGestureRecognizer 函数中弹出并跟随 ,如果 false 则相反

我建议的最佳解决方案是将 UIView 更改为 UIButton 并使用按钮上的 touchUpInside 处理触摸。

这样您将到达您的 objective,因为 UIButton 自动阻止触摸事件转发到 superview