Skip to content

Instantly share code, notes, and snippets.

@Thomvis
Last active July 4, 2019 09:01
Show Gist options
  • Select an option

  • Save Thomvis/0087f98d61025aaf705fff72e3855ce7 to your computer and use it in GitHub Desktop.

Select an option

Save Thomvis/0087f98d61025aaf705fff72e3855ce7 to your computer and use it in GitHub Desktop.

Revisions

  1. Thomvis revised this gist Jul 4, 2019. 1 changed file with 28 additions and 12 deletions.
    40 changes: 28 additions & 12 deletions UIControlEventPublisher.swift
    Original file line number Diff line number Diff line change
    @@ -1,26 +1,42 @@
    class ActionTarget {
    let handler: (Any) -> Void
    let handler: () -> Void

    init<A>(handler: @escaping (A) -> Void) {
    self.handler = {
    handler($0 as! A)
    }
    init(handler: @escaping () -> Void) {
    self.handler = handler
    }

    @IBAction func handle() {
    handler()
    }
    }

    struct AnySubscription: Subscription {
    func request(_ demand: Subscribers.Demand) {
    _request(demand)
    }

    @objc func handle(_ action: Any) {
    handler(action)
    func cancel() {
    _cancel()
    }

    var combineIdentifier: CombineIdentifier = CombineIdentifier(NSUUID())

    let _request: (Subscribers.Demand) -> Void
    let _cancel: () -> Void
    }

    extension UIControl {
    var eventPublisher: AnyPublisher<UIControl.Event, Never> {
    func eventPublisher(for event: UIControl.Event) -> AnyPublisher<UIControl, Never> {
    return AnyPublisher { subscriber in
    subscriber.receive(subscription: Subscriptions.empty)
    let target = ActionTarget {
    _ = subscriber.receive($0)
    var target: ActionTarget?
    subscriber.receive(subscription: AnySubscription(_request: { _ in }, _cancel: {
    target = nil
    }))
    target = ActionTarget {
    _ = subscriber.receive(self)
    }

    self.addTarget(target, action: #selector(ActionTarget.handle), for: .allTouchEvents)
    self.addTarget(target, action: #selector(ActionTarget.handle), for: event)
    }
    }
    }
  2. Thomvis revised this gist Jul 2, 2019. 1 changed file with 2 additions and 1 deletion.
    3 changes: 2 additions & 1 deletion UIControlEventPublisher.swift
    Original file line number Diff line number Diff line change
    @@ -15,8 +15,9 @@ class ActionTarget {
    extension UIControl {
    var eventPublisher: AnyPublisher<UIControl.Event, Never> {
    return AnyPublisher { subscriber in
    subscriber.receive(subscription: Subscriptions.empty)
    let target = ActionTarget {
    subscriber.receive($0)
    _ = subscriber.receive($0)
    }

    self.addTarget(target, action: #selector(ActionTarget.handle), for: .allTouchEvents)
  3. Thomvis renamed this gist Jul 2, 2019. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  4. Thomvis created this gist Jul 2, 2019.
    25 changes: 25 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,25 @@
    class ActionTarget {
    let handler: (Any) -> Void

    init<A>(handler: @escaping (A) -> Void) {
    self.handler = {
    handler($0 as! A)
    }
    }

    @objc func handle(_ action: Any) {
    handler(action)
    }
    }

    extension UIControl {
    var eventPublisher: AnyPublisher<UIControl.Event, Never> {
    return AnyPublisher { subscriber in
    let target = ActionTarget {
    subscriber.receive($0)
    }

    self.addTarget(target, action: #selector(ActionTarget.handle), for: .allTouchEvents)
    }
    }
    }