RxSwift学びの過程〜tableViewCellの操作編〜
背景
既存コードをRxSwift
にて書き直していたとき、cellの操作で詰まりましたので備忘録的にアウトプット。
やはりこいつはすごくクセが強い。
cell上に配置したUIButtonの操作
Issue 1 : cell番号を取得したかった
MVVMで開発をしていてcell
はCustomCell
として作成していたとき、UIButton
をセル上に配置していたのでボタンタップの検知をCustomCellView
に記載していました。
ちなみにUIButton
のタップ検知は
UIButton.rx.tap
となります。
ここで、UIButton
をタップした時にそのcell
のindex(tag)を取得したかったのですが、どのセルのボタンをタップしても0しか取得できませんでした。
func favButtonSetup() {
favButton.rx.tap.asDriver().drive(onNext: { [weak self] _ in
let row = self!.tag
print(row) // 選択されたセルのインデックス(tag)を取得したかったが、いつも0
}).disposed(by: disposeBag)
}
RxSwift
を使わないプレーンな書き方だと@IBOutlet buttonTapped(_:)
にてself.tag
で任意のセルに乗っかっているボタンのイベントを取得できるんですよね。
Issue2 : お気に入りボタンのon/off切り替えが上手くいかない
お気に入りボタンのon/off、データの整合などで操作対象のcell
を取得したいときにもtag
で操作対象の番号を取得するやり方は使えます。
セルの位置に応じてお気に入りボタンをon/off処理(画像を切り替える)ものも実装していましたが、取得できる番号が0のみなのでどのボタンを押しても切り替わるのは一番上のセルだけでした。
コードは大したことないのを上に追加するだけなので割愛します。
原因・解決法
まず調べた中での解決法として、
-
tap.asDriver()
をViewController
にあるセルをどうこうする場所で呼ぶ。(cellForRowAt
とかRxTableViewSectionedReloadDataSource
とか人によって違うと思います) -
override func prepareForReuse()
にてDisposeBag()
を毎度作成し、これでDisposeする
// ViewController内
dataSource = RxTableViewSectionedReloadDataSource<SectionModel>(configureCell: {(_, tableView, indexPath, item) in
let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! ListCell
cell.configure(item: item)
cell.favButton.rx.tap.asDriver().drive(onNext: { [weak self] _ in
//TableViewCell内での記述ではないので indexPath にて rowを取得
let row = indexPath.row
//cell側で作成したdisposeBag()を呼ぶ
}).disposed(by: cell.disposeBag)
return cell
})
// CustomCellView内
var disposeBag = DisposeBag()
override func prepareForReuse() {
disposeBag = DisposeBag()
}
これにはTableViewCellというオブジェクトを作成するライフサイクルに元付いた問題があり、毎度セルを作成する際に作るDisposeBag()
でDispose
する必要があるようです。
終わりに
問題は解決されました。
が、設計上CellViewにある操作はCustomCellViewで行った方がいいんだろうなぁと思うので、このようにViewControllerにcellの操作を書くのはナンセンス?と思います。
CellView内でUIButton時にcellの番号が取得できたりする方法があれば教えていただければ嬉しいです。
参考URL
How to use rx_tap on UIButton of UITableViewCell · Issue #288 · ReactiveX/RxSwift · GitHub
what is best way i can handle button tap in UITableViewCell using RX. · Issue #119 · RxSwiftCommunity/RxDataSources · GitHub
RxSwift UITableViewCell上に配置したボタンの動作 - Qiita
Author And Source
この問題について(RxSwift学びの過程〜tableViewCellの操作編〜), 我々は、より多くの情報をここで見つけました https://qiita.com/sho_v00/items/1319ae56d3ca60ab104e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .