概要
今回は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の実装方法が分かりました。
次回は実際に画面遷移の方法を念の為記載したいと思います。