Skip to content

Instantly share code, notes, and snippets.

@ahmedk92
Created March 13, 2018 07:58
Show Gist options
  • Save ahmedk92/91d9d75a87105cefb0604fbe48dd7b43 to your computer and use it in GitHub Desktop.
Save ahmedk92/91d9d75a87105cefb0604fbe48dd7b43 to your computer and use it in GitHub Desktop.
Closure syntax for UIButton's addTarget
import UIKit
extension UIButton {
typealias BlockType = (UIButton) -> ()
private static var controlStatesBlockKey = "controlStatesBlockKey"
func add(block: @escaping BlockType, forControlEvents controlEvents: UIControlEvents) {
UIButton.controlStatesBlockKey += "\(controlEvents)"
var blocks = (objc_getAssociatedObject(self, &UIButton.controlStatesBlockKey) as? [BlockType]) ?? []
blocks.append(block)
objc_setAssociatedObject(self, &UIButton.controlStatesBlockKey, blocks, .OBJC_ASSOCIATION_COPY_NONATOMIC)
addTarget(self, action: #selector(action(_:)), for: controlEvents)
}
@objc private func action(_ sender: UIButton) {
guard let blocks = objc_getAssociatedObject(self, &UIButton.controlStatesBlockKey) as? [BlockType] else { return }
for block in blocks {
block(self)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment