LoginSignup
11

More than 5 years have passed since last update.

RxSwiftでダブルタップ

Posted at

やったこと

如法会に参加した。「Swiftと機械学習おうちでもくもく会」だったので、RxSwiftの練習をした。
そんなわけで、RxSwiftでダブルタップの処理に挑戦した。

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {

    @IBOutlet weak var sampleButton: UIButton!
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        sampleButton.rx_tap
            .buffer(timeSpan: 1, count: 2, scheduler: MainScheduler.instance)
            .filter { $0.count == 2 }
            .subscribeNext { _ in
                print("Doulbe tap")
            }.addDisposableTo(disposeBag)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

RxSwift で UIKit を扱う基本を参考にしてRxSwiftに入門した。

わかったこと

主なロジックはここ。
swift
sampleButton.rx_tap
.buffer(timeSpan: 1, count: 2, scheduler: MainScheduler.instance)
.filter { $0.count == 2 }
.subscribeNext { _ in
print("Doulbe tap")
}

rx_taprx_controlEvent(.TouchUpInside)のことでTouchUpInsideのイベントだけに限定されてイベントが発生するみたいであった。他のイベントでごにょりたいのであれば、これをつかえばよさそうである。

bufferは1秒に1回ほど、イベントをまとめるようにしたが、イベントが起きない場合でも1秒に1回イベントが起きてしまう。そのためfilterを掛ける必要がある。

subscribeNext.Nextなイベントがやってきたときだけ処理する内容が登録できるようだ。

debugを挟めば、イベントをログに挟めてとても便利であった。

次にしたいこと

  • このままでは、同じボタンにrx_tap.subscribeNextで処理をしてもダブルタップ時にシングルタップのイベントを2つ創出してしまう。なんとかしたい。
  • その他のオペレーターの動きも確認したい。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11