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. 洛谷P1616 疯狂的采药【完全背包】

    题目描述 LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说 ...

  2. 百度之星2014复赛 - 1001 - Find Numbers

    先上题目: Find Numbers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  3. HDU 4617

    题目多读几次就明白了.主要是求异面直线的距离,然后用距离和两圆半径之和作比较. 空间直线的距离d=|AB*n| / |n| (AB表示异面直线任意2点的连线,n表示法向量,法向量为两条异面直线方向向量 ...

  4. OpenCV学习笔记(六十二)——《OpenCV Computer Version with Python》阅读摘要

    如今python火啊.每次OpenCV自带的ml模块都让我直呼坑爹,索性准备用python来做OpenCV后期的机器学习算法的处理.于是赶紧拿起这本书读读. 适合OpenCV和python都有一定基础 ...

  5. JS经常使用表单验证总结

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. 初探BurpSuite

    BurpSuite这套渗透软件.或者已经能够说是渗透攻击平台了吧,玩的好.确实非常方便. 就像是玩英雄联盟的ADC,一開始玩VN.感觉非常难上手,玩多了肯定会爱上VN(啊,貌似提到了什么奇怪的东西). ...

  7. 18124 N皇后问题

    18124 N皇后问题 时间限制:2000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC;VC Description 有N*N的国际象棋棋盘,要 ...

  8. OpenCV打开摄像头失败

    <span style="font-family: Arial, Helvetica, sans-serif;">#include <stdio.h>< ...

  9. [Java][Android][Process] Process 创建+控制+分析 经验浅谈

    不管是Android亦或者Java中或多或少须要调用底层的一些命令.运行一些參数: 此时我们须要用到Java的Process来创建一个子进程.之所以是子进程是由于此进程依赖于发起创建请求的进程,假设发 ...

  10. Window上python 开发--1.搭建开发环境

    事实上在开发python最好在ubuntu环境下,简单也便于扩展各个package.可是我的linux的电脑临时不在身边.还的我老婆的电脑win7没办法啊. 因为python的跨平台性.在window ...