From 22ed253033fa78b97418d2ece49ec659f1db8668 Mon Sep 17 00:00:00 2001 From: Pavel Sharanda Date: Thu, 9 Nov 2017 01:03:52 +0300 Subject: [PATCH] barbuttonitem fix --- Sources/Foundation/NSObject+Jetpack.swift | 41 +++++++++++++++++++++++ Sources/UIKit/UIBarButtonItem.swift | 9 ++--- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/Sources/Foundation/NSObject+Jetpack.swift b/Sources/Foundation/NSObject+Jetpack.swift index 3b9561c..cb52dc7 100644 --- a/Sources/Foundation/NSObject+Jetpack.swift +++ b/Sources/Foundation/NSObject+Jetpack.swift @@ -109,6 +109,17 @@ extension JetpackExtensions where Base: NSObject { } } + func jx_makeTargetActionSignal(key: String, + setup: (Base, AnyObject, Selector)->Void, + cleanup: @escaping (Base, AnyObject, Selector)->Void, + getter: @escaping (Base)->U) -> Signal { + return jx_lazyObject(key: key) { () -> SignalActionHandler in + let controlHandler = SignalActionHandler(key: key, base: base, getter: getter, cleanup: cleanup) + setup(base, controlHandler, #selector(SignalActionHandler.jx_handleAction)) + return controlHandler + }.signal + } + public var autodisposePool: AutodisposePool { return jx_lazyObject(key: #function) { return AutodisposePool() @@ -157,3 +168,33 @@ class NotificationTarget: NSObject { } } } + +class SignalActionHandler: NSObject { + + let signal = Signal() + 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)) + } + } +} diff --git a/Sources/UIKit/UIBarButtonItem.swift b/Sources/UIKit/UIBarButtonItem.swift index b4fc23e..a849a2a 100644 --- a/Sources/UIKit/UIBarButtonItem.swift +++ b/Sources/UIKit/UIBarButtonItem.swift @@ -3,17 +3,18 @@ import UIKit extension JetpackExtensions where Base: UIBarButtonItem { public var clicked: Observable { - 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?) {