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)

}

}

public var tap: ControlEvent的更多相关文章

  1. C#中的隐式类型var——详细示例解析

    从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,它的具体类型由编译器根据上下文推断而出. 下面就让我来总结下隐式类型的一些特点: 1.va ...

  2. 实现tap的多种方式

    一.tap.js 这是一个比较轻量的插件tap.js,142行代码,支持模块化开发. 1)handleEvent addEventListener方法中的第二个参数,我原先并没有注意到其实可以传一个对 ...

  3. Swift 3.0 的 open,public,internal,fileprivate,private 关键字

      import Foundation   /// final的含义保持不变 public final class FinalClass { }   // 这个类在ModuleA的范围外是不能被继承的 ...

  4. 译:Java局部变量类型推断(Var类型)的26条细则

    原文链接:https://dzone.com/articles/var-work-in-progress 作者:Anghel Leonard 译者:沈歌 Java局部变量类型推断(LVTI),简称va ...

  5. [C#] 隐式类型var —— 示例解析

    从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,它的具体类型由编译器根据上下文推断而出. 下面就让我来总结下隐式类型的一些特点: 1.va ...

  6. 移动端 之 触摸事件、Tap事件和swipe事件

    触摸事件 touch是一个事件组,意思不止一个事件,是移动端滑动事件组,touchstart touchmove touchend touchcancel touchstart 当刚刚触摸屏幕的时候触 ...

  7. TypeScript constructor public cause duplicate bug

    TypeScript constructor public cause duplicate bug constructor public const log = console.log; // con ...

  8. 【原创】JDK 9-17新功能30分钟详解-语法篇-var

    JDK 9-17新功能30分钟详解-语法篇-var 介绍 JDK 10 JDK 10新增了新的关键字--var,官方文档说作用是: Enhance the Java Language to exten ...

  9. 【初窥javascript奥秘之事件机制】论“点透”与“鬼点击”

    前言 最近好好的研究了一番移动设备的点击响应速度,期间不断的被自己坑,最后搞得焦头烂额,就是现在可能还有一些问题,但是过程中感觉自己成长不少, 最后居然感觉对javascript事件机制有了更好的认识 ...

随机推荐

  1. mysql中使用order 出现错误

  2. Balanced Number

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  3. LightOJ - 1232 - Coin Change (II)

    先上题目: 1232 - Coin Change (II)   PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: ...

  4. javascript-jsonp的用法

    原文地址 $.ajax({ type: "get", async: false, url: "ajax.ashx", dataType: "jsonp ...

  5. Jackson 过滤属性

    jackson过滤属性分为静态和动态两种. 静态如下: 定义两个Bean 先,这两个bean 是父子关系. public class User { private String name; priva ...

  6. ntp服务及时间同步问题

    今有一小型项目,全然自主弄,原来以为非常easy的NTP服务.我给折腾了2个多小时才整撑头(曾经都是运维搞,没太注意,所以这技术的东西.在简单都须要亲尝啊).这里记录为以后别再浪费时间. 目标环境,5 ...

  7. HTML5和CSS3中的交互新特性

    当文章的标题是一副用photoshop制作的图片,那么势必在搜索引擎中无法搜索到.并且因为图片的体积不算小.可能在网速慢的的时候不得不耐心的等待图片的刷新. 所以.我们来谈谈有没有一种新的方法能够避免 ...

  8. Java异常的捕获与处理

    Java提供了try(尝试).catch(捕捉).finally(最终)这三个关键字来处理异常.在处理各种异常时,需要用到对应的异常类,指的是由程序抛出的对象所属的类. 一.异常处理的使用 由于fin ...

  9. VmBox硬盘容量调整

    硬盘容量修改为15*1024MB. VBoxManage.exe modifyhd "F:\VirtualBox\magiclinux.vdi"   --resize 15360 ...

  10. leetCode(30):Sort Colors

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...