在没有@objc引用的情况下将目标添加到UIButton

问题描述

当我们以编程方式制作UIButton并为其点击动作添加目标时。 对于选择器,即使我们在一个纯粹的快速项目中工作,我们也需要一个带有“ @objc”引用的函数


override func viewDidLoad() {
    let requiredButton = UIButton(frame: CGRect(x: 100,y: 100,width: 50,height: 30))
    self.view.addSubview(requiredButton)
    requiredButton.addTarget(self,action: #selector(self.buttonTapAction(sender:)),for: UIControl.Event.touchUpInside)
}

@objc func buttonTapAction(sender:UIButton) {
    // button action implementation here
}

有没有“ @objC”引用的方法吗?

解决方法

UIButton是NSObject子类的基础对象,因此它在Objective-c运行时执行,因此您需要告诉Swift将代码公开给Objective-c

参考:https://craiggrummitt.com/2016/09/16/any-vs-anyobject-vs-nsobject-in-swift-3/

,

如果您面向 iOS 14+,则可以使用新的 API,无需“@objc”引用:

override func viewDidLoad() {
    let requiredButton = UIButton(frame: CGRect(x: 100,y: 100,width: 50,height: 30),primaryAction: .init(handler: { _ in
        // button action implementation here
    }))
    self.view.addSubview(requiredButton)
}

如果您面向 iOS 13+,您可以使用 SwiftUI 和 Button 控件构建 UI。 SwiftUI 目前在内部基于 UIKit,但您可以使用 SwiftUI 快速编写整个应用程序,而无需单个“@objc”引用