iOS工具类-点击事件Block回调

镇楼专用

最近无聊,突然想到这个原本一直想做的事情,今天趁着手头上暂时没有工作就写了。(代码不好看还请见谅 _)

RuntimeKey

fileprivate struct ViewTargetAcionKey {
    static var gustureActionKey = "DidTapTargetActionBlockKey"
    static var barButtonItemActionKey = "BarButtonItemTargetActionBlockKey"
    static var controlActionKey = "ControlTargetActionBlockKey"
}

UIControl

  • 代码构成
extension UIControl {
   typealias  ControlDidTargetActionBlock = (() -> Void)
            
    func addTarget(forEvent: UIControl.Event = .touchUpInside, actionBlock:@escaping ControlDidTargetActionBlock) {
        objc_setAssociatedObject(self, &ViewTargetAcionKey.controlActionKey, actionBlock, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        self.addTarget(self, action: #selector(controlTargetAction(sender:)), for: forEvent)
    }

    @objc private func controlTargetAction(sender: UIControl) {
        let block = objc_getAssociatedObject(self, &ViewTargetAcionKey.controlActionKey) as? ControlDidTargetActionBlock
        if block != nil {
            block!()
        }
    }
}
  • 使用方法
let button = UIButton()  
button.backgroundColor = .systemBlue   
button.setTitle("按钮", for: .normal)  
button.setTitleColor(.white, for: .normal)      
button.frame = CGRect(x: 100, y: 100, width: 100, height: 100)      
button.addTarget(forEvent: .touchUpInside) {
        // Dodo
}  
view.addSubview(button)

UITapGestureRecognizer

  • 代码构成
extension UITapGestureRecognizer {
    typealias  DidTapTargetActionBlock = (() -> Void)
    convenience init(actionBlock: @escaping DidTapTargetActionBlock) {
        self.init()
        addActionBlock(actionBlock)
        addTarget(self, action: #selector(invoke(_:)))
    }
    
    private func addActionBlock(_ block: DidTapTargetActionBlock?) {
        if (block != nil) {
            objc_setAssociatedObject(self, &ViewTargetAcionKey.gustureActionKey, block!, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    @objc private func invoke(_ sender: Any) {
        let block = objc_getAssociatedObject(self, &ViewTargetAcionKey.gustureActionKey) as? DidTapTargetActionBlock
        if block != nil {
            block!()
        }
    }
}
  • 使用方法
// UIView
let sview = UIView()
sview.backgroundColor = .red
sview.frame = CGRect(x: 100, y: 250, width: 100, height: 100)
sview.addGestureRecognizer(UITapGestureRecognizer(actionBlock: {
     // Dodo
}))
view.addSubview(sview)

// UIImageView
let imageView = UIImageView()
imageView.backgroundColor = .orange
imageView.image = UIImage(named: "icon_share_invite_bg")
imageView.frame = CGRect(x: 100, y: 400, width: 100, height: 100)
imageView.isUserInteractionEnabled = true
imageView.addGestureRecognizer(UITapGestureRecognizer(actionBlock: {
     // Dodo
}))
view.addSubview(imageView)

UIBarButtonItem

  • 代码构成
extension UIBarButtonItem {
    typealias  DidBarButtonItemTargetActionBlock = (() -> Void)

    convenience init(image: UIImage?, actionBlock: @escaping DidBarButtonItemTargetActionBlock) {
        self.init()
        addActionBlock(actionBlock)
        self.image = image
        self.style = .plain
        self.target = self
        self.action = #selector(invoke(_:))
    }
    
    convenience init(title: String?, actionBlock: @escaping DidBarButtonItemTargetActionBlock) {
        self.init()
        addActionBlock(actionBlock)
        self.title = title
        self.style = .plain
        self.target = self
        self.action = #selector(invoke(_:))
    }
    
    private func addActionBlock(_ block: DidBarButtonItemTargetActionBlock?) {
        if (block != nil) {
            objc_setAssociatedObject(self, &ViewTargetAcionKey.barButtonItemActionKey, block!, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    @objc private func invoke(_ sender: Any) {
        let block = objc_getAssociatedObject(self, &ViewTargetAcionKey.barButtonItemActionKey) as? DidBarButtonItemTargetActionBlock
        if (block != nil) {
            block!();
        }
    }
}
  • 使用方法
let rightButtonItem1 = UIBarButtonItem(title: "111", actionBlock: {
        // Dodo
})        
let rightButtonItem2 = UIBarButtonItem(title: "222", actionBlock: {
        // Dodo
})
navigationItem.rightBarButtonItems = [rightButtonItem1, rightButtonItem2]

效果图

效果图.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 6,148评论 4 26
  • 本文主要讲解iOS触摸事件的一系列机制,涉及的问题大致包括: 触摸事件由触屏生成后如何传递到当前应用? 应用接收触...
    baihualinxin阅读 1,230评论 0 9
  • 转载: https://blog.csdn.net/qq871531334/article/details/822...
    NicooYang阅读 1,621评论 0 9
  • 参考原文地址:http://www.jianshu.com/p/b9be23d50f5c 1.UIAccelera...
    earthX阅读 1,377评论 0 4
  • 今天在海边上课。我们在会展集中后,一起漫步去沙滩,路上有一点毛毛细雨,温和凉爽。天不蓝,快乐却像张满风的帆。海水很...
    Neverland_阅读 348评论 1 1