按下 UIButton 时带参数的触发功能

Posted

技术标签:

【中文标题】按下 UIButton 时带参数的触发功能【英文标题】:Triggering function with parameters upon UIButton press 【发布时间】:2017-05-17 23:54:23 【问题描述】:

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

如果我运行此代码(func 是任何函数,a: 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

所以我几乎有一种“解决”问题的方法,但感觉有点像 hack/不正确的方法。只是想弄清楚是否有“真正的”方法可以做到这一点,或者它是否不应该发生。

【问题讨论】:

你调用的函数的定义??? 据我了解你不能。至少你不能回到 Swift 2。我一直在像你一样破解这些限制。那里有很多类似的问题。这是一个***.com/a/38329101/5378116 不是 Swift,它是 ios 的工作原理。你有可能有“行动”的“出口”。这些动作有一个发送者——一个控件。一方面,这是最“纯粹”的 MVC。 (是的,另一方面,它不像你习惯的那样连接。)处理它! @Umer 任何函数只要带参数即可 @Pierce 这就是我的示例,但我认为这是一种解决方法。我想知道是否有更清洁的方法 【参考方案1】:

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

但是有一种方法可以使用 一些 参数运行它,这可能对您有用。

addTarget 的文档说它需要一个选择器,它本质上只是对方法的引用。如果您向它传递一个带有正确参数集的方法,它将调用它并传递它设计要传递的任何内容。如果您发送带有其他参数的方法,您将收到“无法识别的选择器”错误。

UIControladdTarget理解三种选择器:

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)
    

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

【讨论】:

以上是关于按下 UIButton 时带参数的触发功能的主要内容,如果未能解决你的问题,请参考以下文章

fileupload上传文件时带参数

怎么修改注册表让绿色版chrome外部启动时带参数

JavaScript 函数调用时带括号和不带括号的区别

js中new创建对象时带括号和不带括号有啥区别

iOS 原生的 UIButton 点击事件是不允许带多参数的,唯一的一个参数就是默认UIButton本身 那么我们该怎么实现传递多个参数的点击事件呢?

如何在按下其他 UIButton 时触发 UIButton 的“按下效果”或“突出显示效果”