Swift:将参数传递给选择器

时间:2017-02-01 18:45:16

标签: ios swift3

使用Swift 3,Xcode 8.2.1

方法:

func moveToNextTextField(tag: Int) {
   print(tag)
}

下面的行编译正常,但tag有一个未初始化的值:

let selector = #selector(moveToNextTextField)
Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: selector, userInfo: nil, repeats: false)

但是,我需要传递一个参数。下面没有编译:

let selector = #selector(moveToNextTextField(tag: 2))

Swift Compile Error:
Argument of #selector does not refer to an @objc method, property, or initializer.

如何将参数传递给选择器?

2 个答案:

答案 0 :(得分:15)

#selector仅描述方法签名。在您的情况下,初始化选择器的正确方法是

let selector = #selector(moveToNextTextField(tag:))

Timer具有共同的目标 - 动作机制。目标通常是self,action是一个采用一个参数sender: Timer的方法。您应该将其他数据保存到userInfo字典,并从方法中的sender参数中提取它:

func moveToNextTextField(sender: Timer) {
   print(sender.userInfo?["tag"])
}
...
let selector = #selector(moveToNextTextField(sender:))
Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: selector, userInfo: ["tag": 2], repeats: false)

答案 1 :(得分:5)

您无法通过Timer操作传递自定义参数。

无论

#selector(moveToNextTextField)
...
func moveToNextTextField()

#selector(moveToNextTextField(_:))
...
func moveToNextTextField(_ timer : Timer)

支持,没有别的。

要传递自定义参数,请使用userInfo字典。