我有一个通用控件类,需要根据视图控制器设置按钮的完成.由于setLeftButtonActionWithClosure函数需要将闭包作为参数,该闭包应设置为取消按钮的操作.既然我们需要将函数名作为字符串传递给action:parameter,那么在Swift中怎么可能呢.

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

推荐答案

Do Not Use This Answer, See Note Below

NOTE: like @EthanHuang said "This solution doesn't work if you have more than two instances. All actions will be overwrite by the last assignment."

如果要将闭包作为目标添加到UIButton,则必须使用extension将函数添加到UIButton

Swift 5

import UIKit    
extension UIButton {
    private func actionHandler(action:(() -> Void)? = nil) {
        struct __ { static var action :(() -> Void)? }
        if action != nil { __.action = action }
        else { __.action?() }
    }   
    @objc private func triggerActionHandler() {
        self.actionHandler()
    }   
    func actionHandler(controlEvents control :UIControl.Event, ForAction action:@escaping () -> Void) {
        self.actionHandler(action: action)
        self.addTarget(self, action: #selector(triggerActionHandler), for: control)
    }
}

Older

import UIKit

extension UIButton {
    private func actionHandleBlock(action:(() -> Void)? = nil) {
        struct __ {
            static var action :(() -> Void)?
        }
        if action != nil {
            __.action = action
        } else {
            __.action?()
        }
    }
    
    @objc private func triggerActionHandleBlock() {
        self.actionHandleBlock()
    }
    
    func actionHandle(controlEvents control :UIControlEvents, ForAction action:() -> Void) {
        self.actionHandleBlock(action)
        self.addTarget(self, action: "triggerActionHandleBlock", forControlEvents: control)
    }
}

电话:

 let button = UIButton()
 button.actionHandle(controlEvents: .touchUpInside, 
 ForAction:{() -> Void in
     print("Touch")
 })

Swift相关问答推荐

try 在小部件内部读取核心数据的SwiftUI总是返回空吗?

是否在核心数据中使用Uint?

像WebSocket一样接收实时更新,但通过异步/等待或组合

查找数组中 ** 元素 ** 的属性的最小值和最大值

如果通过计时器循环运行,则检索CPU利用率百分比的SWIFT脚本运行良好.似乎在没有计时器的情况下停留在初始百分比上

SwiftData/PersistentModel.swft:540:致命错误:不支持的关系密钥路径ReferenceWritableKeyPath

类型擦除`AsyncMapSequence, Element>`

在这个使用 URLSession 的简单 case 中是否创建了一个强引用循环?

Swift 并发任务与调度队列线程:是什么决定同时运行多少任务?

macOS 的窗口框架中使用的真实类型和真实类型是什么?

使用 swift 的 Firebase 身份验证

SwiftUI View .tint(_ Color) 方法不起作用

Vapor 4,如何按外键过滤?

Swift - 如何更新多目录中的对象

Swift 3.0 的 stringByReplacingOccurencesOfString()

如何轻松删除领域中的所有对象

自定义 MKAnnotation 标注视图?

如何交换快速数组中的元素?

使用 ARAnchor 插入 node 和直接插入 node 有什么区别?

Swift 中的单元测试致命错误