在Swift中为#selector添加静态参数

3

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

如果需要更多上下文:

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

11

经过与一些iOS开发者的确认,目前还不能这样做。

但是有一个替代方案。您可以在操作方法中接收发送方对象。您可以向发送方类添加任何属性,并在操作方法中接收它们。

例如:

第一个方法

let button = UIBarButtonItem(title: "Run",
                                   style: .Plain,
                                   target: self,
                                   action: #selector(run(_:)))
button.tag = 1
And you can receive it like this
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
请在您的答案被接受后不要大幅修改。 - xoogler
1
谢谢!我不知道“tag”属性! - SBlincov

0

0

不,但正如Edward所提到的,可能可以通过按钮本身传递值。

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

.....

func run(sender: UIButton){
     doSomething(sender.tag)
}

通过标签传递值并不推荐,但这是一种方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接