如何识别标签点击自定义UITableViewCell – Swift 3

我有一个自定义UITableViewCell ,我有一个Label ,需要根据特定条件使其可点击。 所以我在其上添加了TapGestureRecognizer 。 我已经使用了协议和代理。 我想传递一个参数,同时点击这个UILabel执行一个segue。 我能够执行此segue但无法检测到哪个单元格的标签。

我是新手,已经被困了几个小时。 任何帮助,将不胜感激。 还请告诉我是否有另一种更简单的方法来获得相同的结果。

如果它是一个按钮我可以添加一个目标,但我现在真的被卡住了。

正如@KrishnaCA在他们的回答中所说,如果你想要整个标签是可点击的,那么使用按钮可能更好。 如果您需要它看起来与按钮不同,您还可以在标签上放置一个透明按钮(没有图像的自定义样式)。

无论您使用按钮还是标签+点击手势识别器,您仍然需要确定用户点击的indexPath。 你可以像哈米德所说的那样在按钮/标签上加一个标签,但这很脆弱。 我更喜欢不同的方式。 我已经写了一个UITableView的扩展,它可以让你找出哪个单元格拥有给定的视图:

 public extension UITableView { /// This method returns the indexPath of the cell that contains the specified view /// - parameter view: The view to find. /// - returns: The indexPath of the cell containing the view, or nil if it can't be found func indexPathForView(_ view: UIView) -> IndexPath? { let origin = view.bounds.origin let viewOrigin = self.convert(origin, from: view) let indexPath = self.indexPathForRow(at: viewOrigin) return indexPath } } 

如果将该扩展添加到项目中,则可以使用如下代码。

手势识别器:

 @objc func alertClicked(sender: UIGestureRecognizer){ let view = sender.view let indexPath = tableView.indexPathForView(view) //Do whatever you need to do with the indexPath } 

或者,对于按钮操作:

 @objc func buttonClicked(sender: UIButton) { let indexPath = tableView.indexPathForView(sender) //Do whatever you need to do with the indexPath } 

给每个单元格一个唯一的标签,然后:

  self.tag = x // x is a unique number label.isUserInteractionEnabled = true let tapGesture = UITapGestureRecognizer(target: self, action:#selector(self.alertClicked(sender:))) self.label.addGestureRecognizer(tapGesture) tapGesture.delegate = self 

并将此函数添加到您的CustomCell类:

 func alertClicked(sender: UITapGestureRecognizer){ print(self.tag)// prints x } 

有很多方法可以实现这一点,你可以在cellForIndexPath tableview委托方法中给标签一个标签,如下所示:

 label.tag = (indexPath as NSIndexPath).row 

然后在你的点击手势function里面:

 func labelTapped (_ sender:UITapGestureRecognizer) { if sender.view?.tag! == someRequiredNumber { // Perform Segue } } 

然后你可以确定它的tag属性点击了什么tag ,然后你必须在tapGesture方法中提出一些逻辑(我使用someRequiredNumber作为例子)来确定用户是否应该能够启动一个segue

我个人更喜欢对TableViewCell进行子类化并使用委托方法将抽头发送回TableView。 您将需要在TableViewCell中提供并保存indexPath并使用委托方法将其传回,这在技术上打破了MVC,但个人代码更加清晰。 如果您对此感兴趣,我可以发布代码。