美文网首页
iOS工具类-点击事件Block回调

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

作者: 今晚月色 | 来源:发表于2019-09-26 16:28 被阅读0次
    镇楼专用

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

    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工具类-点击事件Block回调

          本文链接:https://www.haomeiwen.com/subject/vrknuctx.html