将静态参数添加到Swift中的#selector

时间:2016-06-17 14:47:25

标签: ios swift selector

是否可以通过选择器传递一个int变量,例如#selector(run(1))或#selector(run(2))

必要时提供更多背景信息:

let button = UIBarButtonItem(title: "Run",
                             style: UIBarButtonItemStyle.Plain,
                             target: self,
                             action: #selector(run(1)))

3 个答案:

答案 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)
}

不建议通过标记传递值,但这是一种方式