UIButton按

时间:2017-05-17 23:54:24

标签: swift uikit

我尝试在按下按钮时调用带参数的函数,据我所知#selector只检查函数是否存在然后运行它。我已经看到其他答案可以将按钮发送到该功能,但遗憾的是我认为这不会解决我的问题。

如果我运行此代码(func是任何函数,而且:14只是给出参数的一个示例):

myButton.addTarget(self, action: #selector(func(a: 14)), for: .touchUpInside)

我收到错误说' #selector的参数没有引用@objc方法,属性或初始化程序

我一直在使用的解决方法:

myButton.addTarget(target: self, action: #selector(myFunc), for: .touchUpInside)

func myFunc() {
 someOtherFunc(args)
}

这个问题是,除非要传递的参数是全局的或类范围的并且已知,否则你将无法使用它。

主要问题: 有没有办法让它在单击按钮时运行带参数的函数而不设置类宽变量并评估它而不是使用参数?

我的解决方案: 简化,按钮没有设置等......

var personName:String!

func scrollViewClicked(name:String) {

   personName = name 

   myButton.addTarget(target: self, action: #selector(myFunc), for: .touchUpInside)

}

func myFunc() {
   do something with personName
}

所以我几乎有办法解决问题。问题,但感觉有点像黑客/不正当的方式。试着弄清楚是否有真实的'这样做的方式,或者它是否意味着发生。

1 个答案:

答案 0 :(得分:1)

不,没有办法让UIButton运行带有任意参数的函数。

但是有一种方法可以让它与一些参数一起运行,这可能对你有用。

addTarget的文档说它需要选择器,它实际上只是对方法的引用。如果你传递一个带有正确参数的方法,它会调用它并传递它设计通过的任何东西。如果你发送一个带有其他参数的方法,你将得到一个未被识别的选择器"错误。

UIControl' addTarget了解三种选择器:

func myFunc()
func myFunc(sender: UIButton)
func myFunc(sender: UIButton, forEvent event: UIEvent)

所以可以将其设置为运行带参数的函数,但它知道如何发送的唯一参数是按下的按钮及其生成的事件。

如果您可以使用有关按钮和/或事件的信息来确定您的操作,这仍然可能很有用。例如,您可以设置处理程序:

func myFunc(sender: UIButton, forEvent event: UIEvent) {
    switch(sender) {
    case myButton:
        print("myButton was pressed")
    default:
        print("Something else was pressed.")
    }
}

根据您的使用案例,您可以使用按钮的故事板恢复ID,其标题或其他标识符,或者您甚至可以将UIButton子类化并为其提供一个实例变量来保存您的参数,如下所示:

class MyButtonClass: UIButton {
    var argument:String = ""
}

然后,当您设置按钮时,请指定参数:

myButton.argument = "Some argument"

你可以从你的处理程序中访问它:

func myFunc(sender: UIButton, forEvent event: UIEvent) {
    if let button = sender as? MyButtonClass {
        print(button.argument)
    }
}

它仍然不像在选择器中指定参数那样整洁,但据我所知,这是不可能的。