首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在没有IBOutlet的情况下使用带有UIButton的IBActions

在没有IBOutlet的情况下使用带有UIButton的IBActions,可以通过以下方法实现:

  1. 使用UIButton的addTarget方法

在你的UIViewController中,你可以使用UIButton的addTarget方法来添加一个事件处理程序,如下所示:

代码语言:swift
复制
let button = UIButton(type: .system)
button.setTitle("点击我", for: .normal)
button.frame = CGRect(x: 100, y: 100, width: 100, height: 50)
button.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
self.view.addSubview(button)

然后,你需要在你的UIViewController中实现buttonClicked方法,如下所示:

代码语言:swift
复制
@objc func buttonClicked(sender: UIButton) {
    print("按钮被点击了")
}
  1. 使用闭包

你还可以使用闭包来实现UIButton的点击事件处理程序,如下所示:

代码语言:swift
复制
let button = UIButton(type: .system)
button.setTitle("点击我", for: .normal)
button.frame = CGRect(x: 100, y: 100, width: 100, height: 50)
button.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
self.view.addSubview(button)

button.handleControlEvent(.touchUpInside) { [weak self] sender in
    guard let self = self else { return }
    print("按钮被点击了")
}

在这个例子中,我们使用了一个名为handleControlEvent的方法,它接受一个UIControl.Event枚举值和一个闭包作为参数。这个方法的实现如下所示:

代码语言:swift
复制
extension UIControl {
    func handleControlEvent(_ event: UIControl.Event, closure: @escaping (UIControl) -> Void) {
        let sleeve = ClosureSleeve(closure: closure)
        addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: event)
        objc_setAssociatedObject(self, String(ObjectIdentifier(self).hashValue) + String(event.rawValue), sleeve, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
    }
    
    private class ClosureSleeve {
        let closure: (UIControl) -> Void
        
        init(closure: @escaping (UIControl) -> Void) {
            self.closure = closure
        }
        
        @objc func invoke(sender: UIControl) {
            closure(sender)
        }
    }
}

这个方法使用了一个名为ClosureSleeve的私有类,它包含一个闭包,并且可以将闭包转换为一个Selector,这样就可以将闭包作为UIButton的事件处理程序。

通过以上两种方法,你可以在没有IBOutlet的情况下使用带有UIButton的IBActions。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

IOS移动开发从入门到精通 视图UIView、层CALayer(2)

或者修改 rootViewController参数 2、弹出框: import UIKit class ViewController:UIViewController { var label:UILabel! override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.brown label = UILabel(frame:CGRect(x:40, y:100,width:240, height:44)) label.text = ”” self.view.addSubview(label) let button = UIButton(frame:CGRect(x:40, y:180,width:240, height:44)) button.setTitle(“打开新的视图控制器”, for:UIControlState()) button.backgroundColor = UIColor.black button.addTarget(self, action:#selector(ViewController.openViewController),fo:.touchUpInside) self.view.addSubview(button) } func openViewController() { let newViewController = NewViewController() newViewController.labelTxt = “传递的参数!” newViewController.viewController = self self.present(newViewController, animated:true,completion:nil) } }

01

IOS 弹出框

2、弹出框: import UIKit class ViewController:UIViewController { var label:UILabel! override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.brown label = UILabel(frame:CGRect(x:40, y:100,width:240, height:44)) label.text = ”” self.view.addSubview(label) let button = UIButton(frame:CGRect(x:40, y:180,width:240, height:44)) button.setTitle(“打开新的视图控制器”, for:UIControlState()) button.backgroundColor = UIColor.black button.addTarget(self, action:#selector(ViewController.openViewController),fo:.touchUpInside) self.view.addSubview(button) } func openViewController() { let newViewController = NewViewController() newViewController.labelTxt = “传递的参数!” newViewController.viewController = self self.present(newViewController, animated:true,completion:nil) } }

05
领券