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. GreenPlum 集群常用命令

    GreenPlum 常用命令 gpstate 命令 参数 作用 gpstate -b => 显示简要状态 gpstate -c => 显示主镜像映射 gpstart -d => 指定 ...

  2. WPF通过鼠标滑轮缩放显示图片

    如果你使用WinForm比较难实现通过滚动鼠标滑轮来对图片进行缩放显示,那么,你应该考虑一下使用WPF,既然是下一代Windows客户端开发平台,明显是有一定优势的,不然,MS是吃饱了撑着.   首先 ...

  3. 搜索引擎seo优化

    <a href="" title="SEO优化"></a> <img src="" alt="SEO ...

  4. django QuerySet对象转换成字典对象

    >>> from django.contrib.auth.models import User >>> from django.forms.models impor ...

  5. 【Codeforces Round #519 by Botan Investments A】 Elections

    [链接] 我是链接,点我呀:) [题意] [题解] 枚举k 那么另外一个人的得票就是nk-sum(ai) 找到最小的满足nk-sum(ai)>sum(ai)的k就ok了 [代码] #includ ...

  6. Spring深入理解(三)

    Spring 中 AOP 特性详解 动态代理的实现原理 要了解 Spring 的 AOP 就必须先了解动态代理的原理,因为 AOP 就是基于动态代理实现的.动态代理还要从 JDK 本身说起. 在 Jd ...

  7. ZOJ 1450

    最小圆覆盖 #include <iostream> #include <algorithm> #include <cstdio> #include <cmat ...

  8. [\S\s]+ 可以匹配多行html,最常用的还是.*?

    [\S\s]+ 可以匹配多行html,最常用的还是.*?

  9. netty 学习记录一

    近期在学习netty相关知识,认为<netty 权威指南>这本书还是挺好的,适合我这样的刚開始学习的人.加上netty本身自带的很多样例,学起来还是挺有兴趣的.简单记录下, 一般serve ...

  10. Android基础新手教程——3.4 TouchListener PK OnTouchEvent + 多点触碰

    Android基础新手教程--3.4 TouchListener PK OnTouchEvent + 多点触碰 标签(空格分隔): Android基础新手教程 本节引言: 如题,本节给大家带来的是To ...