如何在 Swift 中动态创建 buttonAction 函数

Posted

技术标签:

【中文标题】如何在 Swift 中动态创建 buttonAction 函数【英文标题】:How create buttonAction functions dynamically in Swift 【发布时间】:2014-11-15 16:20:05 【问题描述】:

在 MCQ 应用程序中,我像这样以编程方式创建多个 UIButton

func createNewButton(buttonName: String, xPosition: CGFloat, yPosition: CGFloat) -> UIButton 
    let myButton = UIButton(frame: CGRectMake(0, 0, 50, 50))
    myButton.center = CGPoint(x: xPosition, y: yPosition)
    myButton.setImage(UIImage(named: buttonName), forState: UIControlState.Normal)
    myButton.addTarget(self, action: "buttonName:", forControlEvents: UIControlEvents.TouchUpInside)
    return myButton
    

问题在于,为了将功能与这些按钮匹配,我需要创建一个功能。因此,该函数应该看起来像

func buttonName(sender: UIButton!) 
    // do some stuff
        

这些函数实际上是将一个字符串保存在一个数组中,而要保存的字符串就是函数本身的名称。如果我们有例如buttonName: "blackberry",代码将设置一个名为"blackberry" 的图像并添加一个名为"blackberry" 的目标操作,因此我想要一个名为func blackberry(sender: UIButton)buttonAction 函数,此函数将保存字符串"blackberry"String 的数组中。

但所有这些都应该在初始 buttonName: String 参数的函数中完成。

或者也许我真的没有以正确的方式做事,那我应该怎么做?

【问题讨论】:

【参考方案1】:

这个怎么样。将所有按钮发送至processButton(button: UIButton)。创建按钮时,设置tag 属性,为每个按钮分配一个唯一编号。然后你可以有一个将按钮标签转换为字符串的数组。

var buttonNames: [String] = []
var currentIndex = 0

func createNewButton(buttonName: String, xPosition: CGFloat, yPosition: CGFloat) -> UIButton 
    let myButton = UIButton(frame: CGRectMake(0, 0, 50, 50))
    myButton.center = CGPoint(x: xPosition, y: yPosition)
    myButton.setImage(UIImage(named: buttonName), forState: UIControlState.Normal)
    myButton.addTarget(self, action: "processButton:", forControlEvents: UIControlEvents.TouchUpInside)
    myButton.tag = currentIndex++
    self.buttonNames.append(buttonName)
    return myButton


func processButton(button: UIButton) 
    let string = buttonNames[button.tag]
    // process string

【讨论】:

非常感谢!非常漂亮的解决方案!起初button.tag 总是返回0,但我设法为每个按钮手动设置了一个标签,现在它可以工作了! (我不知道这个.tag参数,很方便)。 谢谢,但如果我们有两个系列的 buttonNames 数组,我们必须定义第二个 processButton 函数,对吧?有什么方法可以解决这个问题?

以上是关于如何在 Swift 中动态创建 buttonAction 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中的动态表视图中创建动态表视图?

如何在 Swift 4 中以编程方式将 IBAction 添加到按钮?

如何动态创建控件并在swift 4中动态对齐?

Swift:如何从 json 动态创建字典?

如何在 NSObject 类中添加动态行为:Swift

如何在 Swift 中使用动态键(在根级别)解码此 JSON?