将parameter passing给Swift3中的select器

我以编程方式将UITapGestureRecognizer添加到我的某个视图中:

let gesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(modelObj:myModelObj))) self.imageView.addGestureRecognizer(gesture) func handleTap(modelObj: Model) { // Doing stuff with model object here } 

我遇到的第一个问题是“#selector”的参数不是指“@Objc”方法,属性或初始值设定项。

很酷,所以我添加了@objc到handleTap签名:

 @objc func handleTap(modelObj: Model) { // Doing stuff with model object here } 

现在我得到错误“方法不能被标记@objc,因为参数的types不能在Objective-C中表示。

这只是一个build筑物地图的图像,其中一些图钉指示了兴趣点的位置。 当用户点击其中一个引脚时,我想知道他们感兴趣的是哪个点,然后我有一个模型对象来描述这些兴趣点。 我使用这个模型对象在地图上给出了图像的坐标,所以我认为将对象发送到手势处理程序本来就很容易。

这看起来像是误解了一些事情。

当使用目标/动作时 ,函数签名必须具有某种forms…

 func doSomething(sender: Any) 

要么

 func doSomething(sender: Any, forEvent event: UIEvent) 

哪里…

sender参数是发送操作消息的控制对象。

在你的情况下,发件人是UITapGestureRecognizer

此外, #selector()应该包含func签名,并且不包含传递的参数。 因此对于…

 func handleTap(sender: UIGestureRecognizer) { } 

你应该有…

 let gesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:))) 

假设func和手势在一个视图控制器中,其中modelObj是一个属性/ ivar,不需要通过手势识别器来传递它,你可以在handleTap引用它

我认为你应该创build一个调用handleTap(modelObj:myModelObj)@objc方法。

 @objc func someMethod() { // name this properly! handleTap(modelObj: myModelObj) } 

那么你可以通过这个select器:

 #selector(someMethod)