【发布时间】:2014-09-17 16:29:38
【问题描述】:
我想将 UIButton 连接到一段代码 - 根据我的发现,在 Swift 中执行此操作的首选方法仍然是使用 addTarget(target: AnyObject?, action: Selector, forControlEvents: UIControlEvents) 函数。这使用 Selector 构造大概是为了与 Obj-C 库向后兼容。我想我理解 Obj-C 中 @selector 的原因——能够引用方法,因为在 Obj-C 中方法不是一等值。
不过,在 Swift 中,函数是一等值。有没有办法将 UIButton 连接到闭包,类似于:
// -- Some code here that sets up an object X
let buttonForObjectX = UIButton()
// -- configure properties here of the button in regards to object
// -- for example title
buttonForObjectX.addAction(action: {() in
// this button is bound to object X, so do stuff relevant to X
}, forControlEvents: UIControlEvents.TouchUpOutside)
据我所知,上述情况目前是不可能的。考虑到 Swift 看起来它的目标是变得非常实用,这是为什么呢?这两个选项显然可以共存以实现向后兼容性。为什么这不像 JS 中的 onClick() 那样工作?似乎唯一将 UIButton 连接到目标-动作对的方法是使用仅出于向后兼容性原因而存在的东西 (Selector)。
我的用例是在循环中为不同的对象创建 UIButton,然后将每个对象连接到一个闭包。 (设置标签/在字典中查找/子类化 UIButton 是肮脏的半解决方案,但我对如何在功能上做到这一点感兴趣,即这种关闭方法)
【问题讨论】:
标签: ios swift uibutton closures