[RxSwift]cell側のボタンtapをVCで検知する


前提

例えば、
Rxを使用するプロジェクトでCell内部のbuttonタップ検知を行いたい場合は多くあると思います。
しかし、Rxを採用しているのでCell側のbuttonでaddTargetしてDelegateを使って。。。のようなことはあまり使うべきではないです。

そもそもRxはそれらの課題解決を目的としても作られた背景もあります。

ではどのように実装しましょうか。

実装方法はいくつかあると思うのですが、今回はそのうちの一つを紹介していきたいと思います。

RxSwiftを採用しているということはおそらくMVVMアーキテクチャを合わせて採用していると思います。
MVVMアーキテクチャではViewController側でViewModelの参照を持つことがあります。しかしカスタムセルを作っている場合cell側でもViewModelの参照を持たせて。。といった感じになります。
大きなプロジェクトでは話は別ですが、タップ検知しかしないcell側でViewModelの参照を持たせて、DIさせてと毎回書くのは面倒だし(この行為自体は悪いことではない)タップ検知をしたいだけなのに他に書くコードが多すぎて冗長にも感じられるかと思います。

そのような時はViewController側でコードを書いてあげることも一つの手でしょう。

     // cell内のお気に入りボタンタップを検知する
    cell.favoriteButton.rx.tap
        .subscribe(onNext: { _ in
            viewModel.input.favoriteButtonTapped.onNext(())// ViewModelにイベントを送る
         }).disposed(by: cell.disposeBag)// ←cell側のdisposeBagを使用する