RxSwift/RxCocoa/iOS/UIBarButtonItem+Rx.swift

87 lines
2.0 KiB
Swift
Raw Normal View History

//
2015-12-29 18:56:21 +03:00
// UIBarButtonItem+Rx.swift
// RxCocoa
//
// Created by Daniel Tartaglia on 5/31/15.
2015-12-29 18:56:21 +03:00
// Copyright © 2015 Krunoslav Zaher. All rights reserved.
//
#if os(iOS) || os(tvOS)
import UIKit
2015-08-01 16:13:26 +03:00
#if !RX_NO_MODULE
import RxSwift
2015-08-01 16:13:26 +03:00
#endif
var rx_tap_key: UInt8 = 0
extension UIBarButtonItem {
/**
Bindable sink for `enabled` property.
*/
public var rx_enabled: AnyObserver<Bool> {
2016-02-13 23:25:31 +03:00
return UIBindingObserver(UIElement: self) { UIElement, value in
UIElement.enabled = value
}.asObserver()
}
2015-09-09 12:29:39 +03:00
/**
Reactive wrapper for target action pattern on `self`.
*/
public var rx_tap: ControlEvent<Void> {
let source = rx_lazyInstanceObservable(&rx_tap_key) { () -> Observable<Void> in
Observable.create { [weak self] observer in
guard let control = self else {
observer.on(.Completed)
return NopDisposable.instance
}
let target = BarButtonItemTarget(barButtonItem: control) {
observer.on(.Next())
}
return target
}
.takeUntil(self.rx_deallocated)
.share()
}
return ControlEvent(events: source)
}
}
2015-08-24 12:41:32 +03:00
@objc
2015-10-19 01:52:11 +03:00
class BarButtonItemTarget: RxTarget {
typealias Callback = () -> Void
weak var barButtonItem: UIBarButtonItem?
var callback: Callback!
init(barButtonItem: UIBarButtonItem, callback: () -> Void) {
self.barButtonItem = barButtonItem
self.callback = callback
2015-08-24 12:41:32 +03:00
super.init()
barButtonItem.target = self
2016-03-22 13:29:39 +03:00
barButtonItem.action = #selector(BarButtonItemTarget.action(_:))
}
2015-10-19 01:52:11 +03:00
override func dispose() {
super.dispose()
#if DEBUG
MainScheduler.ensureExecutingOnScheduler()
2015-10-19 01:52:11 +03:00
#endif
barButtonItem?.target = nil
barButtonItem?.action = nil
callback = nil
}
func action(sender: AnyObject) {
callback()
}
}
#endif