快速将多个闭包作为参数传递给函数

时间:2018-06-28 04:33:36

标签: swift

因此,我试图将两个闭包传递给创建子视图的函数。将闭包作为参数并调用它们的函数的主要部分如下:

///goButton and cancelButton are class level variables

var goButton = UIButton(type: .system)

var cancelButton = UIButton(type: .system)


func addSubViewWithAction(_ titleString:String, _ button1Text:String, _ button2Text:String, closureYes:@escaping ()->(), closureNo:@escaping ()->()) {

goButton.actionHandle(controlEvents: UIControlEvents.touchUpInside,
                      ForAction:closureYes)

cancelButton.actionHandle(controlEvents: UIControlEvents.touchUpInside,
                          ForAction:closureNo)
}

这就是我要如何称呼它。

addSubViewWithAction("Hide Penguin here?","Yes","Cancel", closureYes: switchPlayers, closureNo: deletePenquin)

问题在于它同时为两个按钮调用deletePenguin函数,而从不调用switchPlayers函数。

这是我通过子视图向主视图添加按钮的方式

    //v here is a UIView object
    //Add all buttons and text to subView
    v.addSubview(titleField)
    v.addSubview(goButton)
    v.addSubview(cancelButton)
    v.layer.cornerRadius = 8

    //Add subView to main view
    window.addSubview(v)

1 个答案:

答案 0 :(得分:0)

问题是actionHandle以某种方式静态工作,因此它将用最新的作业覆盖以前的所有作业。

您可以执行以下操作(此处没有完整的代码解决方案,只有伪代码):

  • 子类UIButton
  • 添加一个实例变量,其中包含要执行的闭包
  • 添加一个实例(助手)函子,该函子用作您的事件的目标,并在内部执行上面的闭包
  • 创建一个函数,该函数将要执行的闭包作为参数。内,
    • 使用提供的闭包分配实例变量
    • 以您的助手函数为目标致电addTarget(_:action:for:)

如果您想支持不同的UIControlEvent,则必须稍微改善这些步骤,也许是使用将事件映射到闭包的字典。