gpt4 book ai didi

ios - 将 UIButton 连接到关闭? (快速,目标 Action )

转载 作者:IT王子 更新时间:2023-10-29 05:01:58 26 4
gpt4 key购买 nike

我想将 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 是肮脏的半解决方案,但我感兴趣的是如何在功能上做到这一点,即这种闭包方法)

最佳答案

您可以通过添加辅助闭包包装器 (ClosureSleeve) 并将其作为关联对象添加到控件以将目标操作替换为闭包,以便保留它。

这与 n13 的回答中的解决方案类似。但我觉得它更简单、更优雅。更直接地调用闭包并自动保留包装器(添加为关联对象)。

swift 3 和 4

class ClosureSleeve {
let closure: () -> ()

init(attachTo: AnyObject, closure: @escaping () -> ()) {
self.closure = closure
objc_setAssociatedObject(attachTo, "[\(arc4random())]", self, .OBJC_ASSOCIATION_RETAIN)
}

@objc func invoke() {
closure()
}
}

extension UIControl {
func addAction(for controlEvents: UIControlEvents = .primaryActionTriggered, action: @escaping () -> ()) {
let sleeve = ClosureSleeve(attachTo: self, closure: action)
addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: controlEvents)
}
}

用法:

button.addAction {
print("Hello")
}

它会自动 Hook 到 .primaryActionTriggered 事件,该事件等于 UIButton 的 .touchUpInside

关于ios - 将 UIButton 连接到关闭? (快速,目标 Action ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24962151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com