public var tap: ControlEvent
extension Reactive where Base: UIButton {
/// Reactive wrapper for `TouchUpInside` control event.
public var tap: ControlEvent<Void> {
return controlEvent(.touchUpInside)
}
}
extension Reactive where Base: UIControl {
public func controlEvent(_ controlEvents: UIControlEvents) -> ControlEvent<()> {
let source: Observable<Void> = Observable.create { [weak control = self.base] observer in
MainScheduler.ensureExecutingOnScheduler()
guard let control = control else {
observer.on(.completed)
return Disposables.create()
}
let controlTarget = ControlTarget(control: control, controlEvents: controlEvents) {
control in
observer.on(.next(()))
}
return Disposables.create(with: controlTarget.dispose)
}
.takeUntil(deallocated)
return ControlEvent(events: source)
}
}
final class ControlTarget: RxTarget {
typealias Callback = (Control) -> Void
let selector: Selector = #selector(ControlTarget.eventHandler(_:))
weak var control: Control?
#if os(iOS) || os(tvOS)
let controlEvents: UIControlEvents
#endif
var callback: Callback?
#if os(iOS) || os(tvOS)
init(control: Control, controlEvents: UIControlEvents, callback: @escaping Callback) {
MainScheduler.ensureExecutingOnScheduler()
self.control = control
self.controlEvents = controlEvents
self.callback = callback
super.init()
control.addTarget(self, action: selector, for: controlEvents)
let method = self.method(for: selector)
if method == nil {
rxFatalError("Can't find method")
}
}
#elseif os(macOS)
init(control: Control, callback: @escaping Callback) {
MainScheduler.ensureExecutingOnScheduler()
self.control = control
self.callback = callback
super.init()
control.target = self
control.action = selector
let method = self.method(for: selector)
if method == nil {
rxFatalError("Can't find method")
}
}
#endif
@objc func eventHandler(_ sender: Control!) {
if let callback = self.callback, let control = self.control {
callback(control)
}
}
override func dispose() {
super.dispose()
#if os(iOS) || os(tvOS)
self.control?.removeTarget(self, action: self.selector, for: self.controlEvents)
#elseif os(macOS)
self.control?.target = nil
self.control?.action = nil
#endif
self.callback = nil
}
}
public struct ControlEvent<PropertyType> : ControlEventType {
public typealias E = PropertyType
let _events: Observable<PropertyType>
/// Initializes control event with a observable sequence that represents events.
///
/// - parameter events: Observable sequence that represents events.
/// - returns: Control event created with a observable sequence of events.
public init<Ev: ObservableType>(events: Ev) where Ev.E == E {
_events = events.subscribeOn(ConcurrentMainScheduler.instance)
}
}
最新文章
- GJM :Unity使用EasyAR实现脱卡功能
- Nginx主配置参数详解,Nginx配置网站
- struts2的文件上传
- yii2 数据导出 excel导出以及导出数据时列超过26列时解决办法
- python2.7到python3代码转换脚本2to3的一些介绍
- 将JZ2440的调试串口换成com2
- MySql 创建只读账号
- MPlayer-ww 增加边看边剪切功能
- .Net neatupload上传控件实现文件上传的进度条
- 越狱Season 1-Episode 8: The Old Head
- 慕课网-安卓工程师初养成-3-2 Java中的算术运算符
- maven本地仓库.m2文件夹路径讲解
- delphi 文件或目录转换成 TreeView
- [Hadoop源码解读](一)MapReduce篇之InputFormat
- python包管理-distutils,setuptools,pip,virtualenv等介绍
- HDU_2012——判断表达式是否都为素数
- C语言的本质(33)——GCC编译器入门
- iTunes制作iPhone手机铃声方法(mac版2017年4月更新)
- swoole 入门
- linux tar命令 压缩、打包、解压 详解