123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- //
- // UIButtonExtensions.swift
- // ALCameraViewController
- //
- // Created by Alex Littlejohn on 2016/03/26.
- // Copyright © 2016 zero. All rights reserved.
- //
- import UIKit
- typealias ButtonAction = () -> Void
- extension UIButton {
-
- private struct AssociatedKeys {
- static var ActionKey = "ActionKey"
- }
-
- private class ActionWrapper {
- let action: ButtonAction
- init(action: @escaping ButtonAction) {
- self.action = action
- }
- }
-
- var action: ButtonAction? {
- set(newValue) {
- removeTarget(self, action: #selector(performAction), for: .touchUpInside)
- var wrapper: ActionWrapper? = nil
- if let newValue = newValue {
- wrapper = ActionWrapper(action: newValue)
- addTarget(self, action: #selector(performAction), for: .touchUpInside)
- }
-
- objc_setAssociatedObject(self, &AssociatedKeys.ActionKey, wrapper, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- get {
- guard let wrapper = objc_getAssociatedObject(self, &AssociatedKeys.ActionKey) as? ActionWrapper else {
- return nil
- }
-
- return wrapper.action
- }
- }
-
- @objc func performAction() {
- guard let action = action else {
- return
- }
- action()
- }
- }
|