希望这对iOS / Swift开发人员来说是一个简单的问题。我有一个UITableViewCell,左边是文本,右边是图像。如果用户点击该行,我会做一些事情并且工作得很好。但是,如果用户点击图像,我需要做其他事情。我看了Detect Tap on UIImageView within UITableViewCell,但我没有把Objective-C很好地翻译成Swift。
我的假设是我需要在我的子类UITableViewCell中执行类似的操作:
@IBOutlet var handsfreeImage: UIImageView!
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
let handsfreeTap = UITapGestureRecognizer(target: handsfreeImage, action:Selector("handsfreeTap:"))
}
func handsfreeTap(recognizer: UITapGestureRecognizer) {
println("The handsfree image was tapped")
}
但是,这不起作用。关于我做错了什么的想法?
答案 0 :(得分:4)
您没有正确使用UITapGestureRecognizer
。
target
应该是实现处理程序方法的类。
所以它应该是
let handsfreeTap = UITapGestureRecognizer(target: self, action:Selector("handsfreeTap:"))
然后,您需要将手势识别器添加到视图中。
handsfreeImage.addGestureRecognizer(handsfreeTap)
这一切都应该有效。它可能仍然没有按照您想要的方式运行,因为它会缺少一些功能,例如长保持和点按高亮显示。如果这些是您关心的事情,我建议您只使用UIButton
image
背景而不是UIImageView
,因为它会在内部处理所有内容而无需您处理
答案 1 :(得分:2)
您创建了识别器,但仍需要将其添加到视图中。所以
whateverYourImageViewIs.addGestureRecognizer(handsfreeTap)
答案 2 :(得分:2)
所以,我从来没有能够使UITapGestureRecognizer方法工作(这很难过,因为我认为这是一个优雅的解决方案)。所以,我最终使用了委托方法:
protocol HandsFreeTapCellDelegate {
func handsFreeTap(handsFreeButton: VehicleTableViewCell)
}
class VehicleTableViewCell: UITableViewCell {
var delegate : HandsFreeTapCellDelegate?
@IBAction func handsFreeTap(sender: UIButton) {
delegate?.handsFreeTap(self)
}
}
class FooViewController: UIViewController, HandsFreeTapCellDelegate, UITableViewDelegate, UITableViewDataSource {
func handsFreeTap(handsFreeButton: VehicleTableViewCell) {
println("handsfreeButton was tapped, the row is: \(handsFreeButton.tag)")
}
}