一尘不染

在Swift中将参数传递给选择器

swift

我正在以编程方式将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’方法,属性或初始化程序。

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

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

现在,我收到错误消息“无法将方法标记为@objc,因为无法在Objective-C中表示参数的类型。

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


阅读 288

收藏
2020-07-07

共1个答案

一尘不染

看来您误解了几件事。

使用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是一个属性/ ivar,则无需将其与手势识别器一起传递,您只需在handleTap

2020-07-07