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)

}

}

最新文章

  1. GJM :Unity使用EasyAR实现脱卡功能
  2. Nginx主配置参数详解,Nginx配置网站
  3. struts2的文件上传
  4. yii2 数据导出 excel导出以及导出数据时列超过26列时解决办法
  5. python2.7到python3代码转换脚本2to3的一些介绍
  6. 将JZ2440的调试串口换成com2
  7. MySql 创建只读账号
  8. MPlayer-ww 增加边看边剪切功能
  9. .Net neatupload上传控件实现文件上传的进度条
  10. 越狱Season 1-Episode 8: The Old Head
  11. 慕课网-安卓工程师初养成-3-2 Java中的算术运算符
  12. maven本地仓库.m2文件夹路径讲解
  13. delphi 文件或目录转换成 TreeView
  14. [Hadoop源码解读](一)MapReduce篇之InputFormat
  15. python包管理-distutils,setuptools,pip,virtualenv等介绍
  16. HDU_2012——判断表达式是否都为素数
  17. C语言的本质(33)——GCC编译器入门
  18. iTunes制作iPhone手机铃声方法(mac版2017年4月更新)
  19. swoole 入门
  20. linux tar命令 压缩、打包、解压 详解

热门文章

  1. sql server备份策略
  2. Redis学习笔记(一)-持久化
  3. 21.实验基于_version进行乐观锁并发控制
  4. Oracle笔记 多表查询
  5. poj 2186 强连通+缩点
  6. Storm工作流程 vs. Spark Stream
  7. HDU 5174
  8. HDU 2296
  9. CSS3 timing-function: steps()介绍
  10. QQ好友列表数据模型封装