如何禁用为 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 的可访问性