RxSwift

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.itemSelecteditemSelecteddidSelectRowAtに該当する関数になります。
これだけのコードでUITableViewDelegateをVCに準拠させなくてもdelegateメソッドを使うことができるようになります。

subscribeの引数indexPathにタップしたcellのindex情報が含まれています。

まとめ

これでUITableViewDelegateの実装方法が分かりました。
次回は実際に画面遷移の方法を念の為記載したいと思います。

ABOUT ME
tamappe
都内で働くiOSアプリエンジニアのTamappeです。 当ブログではモバイルアプリの開発手法について紹介しています。メインはiOS、サブでFlutter, Android も対応できます。 執筆・講演のご相談は tamapppe@gmail.com までお問い合わせください。