Skip to content

Commit

Permalink
barbuttonitem fix
Browse files Browse the repository at this point in the history
  • Loading branch information
psharanda committed Nov 8, 2017
1 parent c2621ec commit 22ed253
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 4 deletions.
41 changes: 41 additions & 0 deletions Sources/Foundation/NSObject+Jetpack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,17 @@ extension JetpackExtensions where Base: NSObject {
}
}

func jx_makeTargetActionSignal<U>(key: String,
setup: (Base, AnyObject, Selector)->Void,
cleanup: @escaping (Base, AnyObject, Selector)->Void,
getter: @escaping (Base)->U) -> Signal<U> {
return jx_lazyObject(key: key) { () -> SignalActionHandler<Base, U> in
let controlHandler = SignalActionHandler(key: key, base: base, getter: getter, cleanup: cleanup)
setup(base, controlHandler, #selector(SignalActionHandler<Base, U>.jx_handleAction))
return controlHandler
}.signal
}

public var autodisposePool: AutodisposePool {
return jx_lazyObject(key: #function) {
return AutodisposePool()
Expand Down Expand Up @@ -157,3 +168,33 @@ class NotificationTarget<Base: AnyObject, T>: NSObject {
}
}
}

class SignalActionHandler<Base: AnyObject, T>: NSObject {

let signal = Signal<T>()
let getter: (Base)->T
weak var base: Base?
let key: String
let cleanup: (Base, AnyObject, Selector)->Void

init(key: String, base: Base, getter: @escaping (Base)->T, cleanup: @escaping (Base, AnyObject, Selector)->Void) {
self.key = key
self.getter = getter
self.base = base
self.cleanup = cleanup
super.init()
}

@objc func jx_handleAction() {
if let base = base {
signal.update(getter(base))
}

}

deinit {
if let base = base {
cleanup(base, self, #selector(jx_handleAction))
}
}
}
9 changes: 5 additions & 4 deletions Sources/UIKit/UIBarButtonItem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@ import UIKit
extension JetpackExtensions where Base: UIBarButtonItem {

public var clicked: Observable<Void> {
return jx_makeTargetActionObservable(setup: { base, target, action in
return jx_makeTargetActionSignal(key: #function, setup: { base, target, action in
base.target = target
base.action = action
}, cleanup: { base, target, action in
}, cleanup: { base, _, _ in
base.target = nil
base.action = nil
}, getter: { _ in })
}, getter: { _ in
()
}).asObservable
}
}


extension UIBarButtonItem {

public convenience init(title: String?) {
Expand Down

0 comments on commit 22ed253

Please sign in to comment.