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

2019-09-26  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读