如何禁用为 UITableViewCell 的某些部分调用 DidSelect?

Posted

技术标签:

【中文标题】如何禁用为 UITableViewCell 的某些部分调用 DidSelect?【英文标题】:How to disable DidSelect being called for some part of UITableViewCell? 【发布时间】:2017-09-01 10:28:50 【问题描述】:

由于我的单元格在点击时可展开并且在可展开部分包含两个按钮,因此我想让 DidSelect/DidDeselect 在用户点击这些按钮时不被调用以改善用户体验。

按钮放置在另一个 UIView 内的 StackView 内。

我尝试为 stackView 和 UIView 容器禁用 userInteraction,但结果相同。

您会建议如何禁用整个 UIView 容器(注意这是我的单元格的一部分),以便在点击时调用 DidSelect/DidDeselect?

【问题讨论】:

完全禁用选择并在单元格本身中实现选择,仅在您希望选择的部分中。 您可以将这些按钮放在另一个更大的视图上。 @vaibhav 他们已经在视图中,请看上面的视图层次结构图 你试过实现这两个按钮的动作吗?每当您点击这些按钮时,它们各自的操作方法都会调用,而不是 didSelect 或 didDeSelect 方法。 @vaibhav 我不确定你的意思 【参考方案1】:

尝试在stackView中实现这两个按钮的动作。

// inside cellForRowAt indexPath
cell?.button1.tag = indexPath.row
cell?.button1.addTarget(self, action: #selector(defineTypeAction(_:)), for: .touchUpInside)

各自的行动:

func defineTypeAction (_ sender: UIButton)
    let alert=UIAlertController(title: kAppName, message: "Select", preferredStyle: UIAlertControllerStyle.alert)
    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: (action:UIAlertAction) in
        sender.setTitle("your title", for: .normal)
        // your custom code
    ));

    present(alert, animated: true, completion: nil)

当您点击按钮时,它们的操作方法将被调用,而不是 tableView 委托方法。

【讨论】:

感谢您的回答,但我不知道此答案与禁用在 TableViewCell 的某些部分调用的 DidSelect 有何关系 如果你实现了这些,你不能禁用tableView的委托方法,你只能分配按钮目标以防止didSelect方法调用。【参考方案2】:

斯威夫特 4.2

实现这一点的基本方法是用另一个点击手势识别器中断 tableview 点击手势。

如果您的单元格中有自定义视图,只需将手势识别器添加到您的视图中即可。

@objc func handleTouch()
    print("Table view interrupted")


override func awakeFromNib() 
    super.awakeFromNib()
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTouch))
    interruptView.addGestureRecognizer(tapGesture)

如果您不创建自定义视图,只需为自定义单元格中的任何视图 (interruptView) 实现这些方法。

【讨论】:

以上是关于如何禁用为 UITableViewCell 的某些部分调用 DidSelect?的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时将 UITableViewCell 从启用更改为禁用,使其文本从黑色变为灰色?

如何禁用 UITableViewCell 上的删除操作?

如何禁用 UITableViewCell 突出显示?

如何禁用自定义静态 UITableViewCell 的可访问性

使用 rxswift 禁用 UITableViewCell 编辑模式

如何为 UITableViewCell 的子视图禁用 UITapGesture?