2017-04-06 68 views
8

我编程方式添加到UITapGestureRecognizer我的观点一个选择:参数传递到Swift3

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因为TY参数pe不能在Objective-C中表示。

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

+0

另一个功能时无法传递值那样的选择。为什么你不能将这个值保存在一个实例变量中并从选择器方法访问它? –

+4

http://stackoverflow.com/questions/35635595/sending-a-parameter-argument-to-function-through-uitapgesturerecognizer-selector可能的重复。 –

回答

20

它看起来像你误会了几件事。

当使用target/action,函数签名必须具有一定的形式...

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是一个属性/伊娃,没有必要与传递手势识别器,你可以参考它在handleTap

1

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

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

然后你就可以通过这一个选择:

#selector(someMethod) 
0

,而不是试图直接调用handleTap这样的:

#selector(self.handleTap(modelObj:myModelObj)) 

你可以创建一个函数,然后调用与参数

#selector(anyName) 

func anyName() { 
    let model = Model() 
    handleTap(modelObj: model) 
} 

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