UIButtonExtensions.swift 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. //
  2. // UIButtonExtensions.swift
  3. // ALCameraViewController
  4. //
  5. // Created by Alex Littlejohn on 2016/03/26.
  6. // Copyright © 2016 zero. All rights reserved.
  7. //
  8. import UIKit
  9. typealias ButtonAction = () -> Void
  10. extension UIButton {
  11. private struct AssociatedKeys {
  12. static var ActionKey = "ActionKey"
  13. }
  14. private class ActionWrapper {
  15. let action: ButtonAction
  16. init(action: @escaping ButtonAction) {
  17. self.action = action
  18. }
  19. }
  20. var action: ButtonAction? {
  21. set(newValue) {
  22. removeTarget(self, action: #selector(performAction), for: .touchUpInside)
  23. var wrapper: ActionWrapper? = nil
  24. if let newValue = newValue {
  25. wrapper = ActionWrapper(action: newValue)
  26. addTarget(self, action: #selector(performAction), for: .touchUpInside)
  27. }
  28. objc_setAssociatedObject(self, &AssociatedKeys.ActionKey, wrapper, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  29. }
  30. get {
  31. guard let wrapper = objc_getAssociatedObject(self, &AssociatedKeys.ActionKey) as? ActionWrapper else {
  32. return nil
  33. }
  34. return wrapper.action
  35. }
  36. }
  37. @objc func performAction() {
  38. guard let action = action else {
  39. return
  40. }
  41. action()
  42. }
  43. }