RxSwiftでUITableViewのセルをタップした時の挙動をハックする
概要
今回はRxSwiftを使ってUITableViewで表示されたセルのitemをタップした時の挙動をハンドリングする実装について解説します。
UITableViewDelegate
の部分の実装となります。
関数としては
Sample.swift
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
こちらに該当します。
開発環境について
Xcode: 10.1
Swift: 4.2
RxSwift: 4.4.0
RxCocoa: 4.4.0
ソースコードについて
今回は前回の記事のstoryboardを拝借しますのでstoryboardなどの配置は省略します。
ただViewController.swift
のソースコードに追加のコードを書きます。
ViewController.swift
import UIKit import RxCocoa import RxSwift class ViewController: UIViewController { @IBOutlet weak var tableView: UITableView! let data = Observable<[CustomCellModel]>.just([ CustomCellModel(name: "山田花子", email: "hanako@gmail.com"), CustomCellModel(name: "田中太郎", email: "taro@gmail.com"), CustomCellModel(name: "石田真一", email: "shinichi@gmail.com") ]) var disposeBag = DisposeBag() override func viewDidLoad() { super.viewDidLoad() // CustomCellのNibファイルの登録 tableView.register(UINib(nibName: "CustomTableViewCell", bundle: nil), forCellReuseIdentifier: "CustomTableViewCell") data.bind(to: tableView.rx.items(cellIdentifier: "CustomTableViewCell", cellType: CustomTableViewCell.self)) { row, element, cell in // row: Int アイテムのインデックス // element: Item(CustomCellModel) アイテムのインスタンス // cell: CustomCell セルのインスタンス // ここでセルの中身を設定する cell.nameLabel.text = element.name cell.emailLabel.text = element.email } .disposed(by: disposeBag) // tableViewのセルをタップした時のメソッド tableView.rx.itemSelected .subscribe(onNext: { indexPath in // func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) print(indexPath.row) }) .disposed(by: disposeBag) } }
tableView.rx.itemSelected
のitemSelected
がdidSelectRowAt
に該当する関数になります。
これだけのコードでUITableViewDelegate
をVCに準拠させなくてもdelegateメソッドを使うことができるようになります。
subscribeの引数indexPath
にタップしたcellのindex情報が含まれています。
まとめ
これでUITableViewDelegateの実装方法が分かりました。
次回は実際に画面遷移の方法を念の為記載したいと思います。