如何在 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 函数的主要内容,如果未能解决你的问题,请参考以下文章