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]
效果图
