将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)