gpt4 book ai didi

ios - 将闭包作为目标添加到 UIButton

转载 作者:IT王子 更新时间:2023-10-29 05:02:48 25 4
gpt4 key购买 nike

我有一个通用控件类,它需要根据 View Controller 设置按钮的完成。由于 setLeftButtonActionWithClosure 函数需要将闭包作为参数,闭包应该设置为取消按钮的操作。它会怎样在 Swift 中是可能的,因为我们需要将函数名称作为 String 传递给 action: 参数。

func setLeftButtonActionWithClosure(completion: () -> Void)
{
self.leftButton.addTarget(<#target: AnyObject?#>, action: <#Selector#>, forControlEvents: <#UIControlEvents#>)
}

最佳答案

在 iOS 14 中,Apple 终于将此功能添加到 UIKit。但是,有人可能仍想使用此扩展,因为 Apple 的方法签名不是最优的。

iOS 14:

extension UIControl {
func addAction(for controlEvents: UIControl.Event = .touchUpInside, _ closure: @escaping()->()) {
addAction(UIAction { (action: UIAction) in closure() }, for: controlEvents)
}
}

iOS 14 之前的版本:

extension UIControl {
func addAction(for controlEvents: UIControl.Event = .touchUpInside, _ closure: @escaping()->()) {
@objc class ClosureSleeve: NSObject {
let closure:()->()
init(_ closure: @escaping()->()) { self.closure = closure }
@objc func invoke() { closure() }
}
let sleeve = ClosureSleeve(closure)
addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: controlEvents)
objc_setAssociatedObject(self, "\(UUID())", sleeve, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
}

用法:

button.addAction {
print("Hello, Closure!")
}

或:

button.addAction(for: .touchUpInside) {
print("Hello, Closure!")
}

或者如果避免保留循环:

self.button.addAction(for: .touchUpInside) { [unowned self] in
self.doStuff()
}

(此处包含扩展名:https://github.com/aepryus/Acheron)

另请注意,理论上 .primaryActionTriggered 可以替代 .touchUpInside,但它目前似乎在催化剂中存在漏洞,所以我暂时保留它。

关于ios - 将闭包作为目标添加到 UIButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25919472/

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