首页
学习
活动
专区
工具
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。

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

相关·内容

共45个视频
2022全新MyBatis框架教程-循序渐进,深入浅出(上)
动力节点Java培训
通过本课程的学习,可以在最短的时间内学会使用持久层框架MyBatis,在该视频中没有废话,都是干货,该视频的讲解不是学术性研究,项目中用什么,这里就讲什么,如果您现在项目中马上要使用MyBatis框架,那么您只需要花费3天的时间,就可以顺利的使用MyBatis开发了。
共0个视频
2022全新MyBatis框架教程-循序渐进,深入浅出(中)
动力节点Java培训
通过本课程的学习,可以在最短的时间内学会使用持久层框架MyBatis,在该视频中没有废话,都是干货,该视频的讲解不是学术性研究,项目中用什么,这里就讲什么,如果您现在项目中马上要使用MyBatis框架,那么您只需要花费3天的时间,就可以顺利的使用MyBatis开发了。
共0个视频
2022全新MyBatis框架教程-循序渐进,深入浅出(下)
动力节点Java培训
通过本课程的学习,可以在最短的时间内学会使用持久层框架MyBatis,在该视频中没有废话,都是干货,该视频的讲解不是学术性研究,项目中用什么,这里就讲什么,如果您现在项目中马上要使用MyBatis框架,那么您只需要花费3天的时间,就可以顺利的使用MyBatis开发了。
共17个视频
动力节点-JDK动态代理(AOP)使用及实现原理分析
动力节点Java培训
动态代理是使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理,必须有接口,目标类必须实现接口, 没有接口时,需要使用cglib动态代理。 动态代理可以在不改变原来目标方法功能的前提下, 可以在代理中增强自己的功能代码。
领券