是否可以通过选择器传递一个int变量,例如#selector(run(1))或#selector(run(2))
必要时提供更多背景信息:
let button = UIBarButtonItem(title: "Run",
style: UIBarButtonItemStyle.Plain,
target: self,
action: #selector(run(1)))
答案 0 :(得分:4)
在向一些iOS开发者确认之后,你还不能做到这一点。
但还有另一种选择。您可以在操作方法中接收发件人对象。您可以将任何属性添加到sender类。并接受该行动方法。
例如:
let button = UIBarButtonItem(title: "Run",
style: .Plain,
target: self,
action: #selector(run(_:)))
button.tag = 1
你可以像这样收到它
func run(sender: UIBarButtonItem) {
let passedInteger = sender.tag
}
但是只有传递的参数是单个整数才有效。如果您想要使用任何数据类型传递多个参数,请执行以下操作 - >看第二种方法
子类UIBarButtonItem
class MyBarButtonItem: UIBarButtonItem {
var passedParameter: String?
}
并像这样接收
let button = MyBarButtonItem(title: "Run",
style: .Plain,
target: self,
action: #selector(run(sender:)))
button.passedParameter = "John Doe"
func run(sender: MyBarButtonItem) {
// now you have the parameter
let parameter = sender.passedParameter
}
答案 1 :(得分:0)
截至https://github.com/apple/swift-evolution/blob/master/proposals/0022-objc-selectors.md
#selector
只是用于声明方法的类型安全方式。所以关于方法签名,你不能添加静态参数
例如
let sel = #selector(UIView.insertSubview(_:atIndex:)) // produces the Selector "insertSubview:atIndex:"
答案 2 :(得分:0)
不,但正如爱德华提到的那样,可以通过按钮本身传递值。
let button = UIBarButtonItem(title: "Run",
style: UIBarButtonItemStyle.Plain,
target: self,
action: #selector(run(_:)))
button.tag = 1
.....
func run(sender: UIButton){
doSomething(sender.tag)
}
不建议通过标记传递值,但这是一种方式