ios - 如何动态向 UIButton 添加操作

标签 ios swift uibutton

我注意到我有很多函数可以在我的 View Controller 之一中动态添加按钮,这显然违背了 DRY 原则。

为了解决这个问题,我编写了一个 hit-everything configureButton 函数:

func configureButton (button: UIButton, action: String, title: String, pos: [CGFloat]) {
    button.addTarget(self, action: action,
            forControlEvents: UIControlEvents.TouchUpInside)
    // ^ throws an error

    // button.addTarget(self, action: "goToScanner",
    //        forControlEvents: UIControlEvents.TouchUpInside)

    /* configure everything else */        

    self.view.addSubview(button)
}

当我有无数不同的功能时,我只是写了类似的东西

button.addTarget(self, action: "goToScanner",    // <-- note the string
        forControlEvents: UIControlEvents.TouchUpInside)

在每个函数中,其中 "goToScanner" 是我想要点击调用的函数。

我希望能够动态地将 button.addTarget 的操作参数传递给 configureButton:

configureButton(scanButton, action: "goToScanner", title: "Scan", pos: [36.0, 300])

我尝试传递一个闭包 () -> (),但这不起作用。

如何解决这个问题?

最佳答案

你的方法应该是

func configureButton (button: UIButton, action: Selector, title: String, pos: [CGFloat])

注意它如何使用Selector而不是String

这是因为 Swift 没有内置的选择器实现,您传递一个字符串,并且字符串文字被类型推断为选择器 (就像输入数字文字将作为 int、float、NSNumber 等一样工作)。

关于ios - 如何动态向 UIButton 添加操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30554577/

相关文章:

ios - Swift - 如何从值中获取字典元素的索引?

ios - UIWindow addSubview 在 iOS 9 中不起作用

iphone - 来自 AppDelegate 的共享 ADBannerView - 如何从代表处获取广告

ios - 使用 Swift (iOS) 和照片框架保存自定义图像的元数据

delegates - 为什么使用委托(delegate)和协议(protocol)而不是仅仅在 Swift 中传递一个实例?

ios - 如何将 UIButton 设置为转到上一个屏幕?

ios - 用简洁的方式在 Swift 中重构 Switch-Case

ios - 没有挑战的登录表单(适配器)

ios - UIButton 图片静态大小

ios - 如何从可重用的标题按钮调用 collectionView.reloadData()?