CustomCellのボタンをどのCellのものか判別する

前回の[Swift4]CustomCellミニマムサンプルをベースに解説をします。

Cellのボタンのタップ

前回の記事ではcellのButtonにタップ処理をつけていなかったのでつけるところから始めます。

addTargetを追加

addTargetはcellをTableViewに追加するメソッドで呼び出します。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "customCell") as! CustomTableViewCell
        cell.setData(buttonText: "作る", labelText: misoSoup[indexPath.row])
        //ここでaddTargetを設定できる
        cell.button.addTarget(self, action: #selector(tapCellButton(_:)), for: .touchUpInside)
        return cell
    }

タップメソッド

    @objc func tapCellButton(_ sender: UIButton) {
        print("タップされたよ")
    }

問題点

これでタップを検知することはできるのですが、まだ問題が残っています。

現状ではどのcellがタップされたのか判定しようがありません。selectorのメソッドにはUI以外の引数は渡せませんしハマりどころです。

tapされたボタンのCellを判定する

今回の本題です。解決方法は1つではありませんが、私がよく使うのはbuttonにタグを設定する方法です。

Buttonにtagをつける

ボタンにはInt型のtagをつけることができます、これをcellを追加する際にボタンに設定しておくことでボタンがどのセルのボタンなのかを判別できるようになります。

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "customCell") as! CustomTableViewCell
        cell.setData(buttonText: "作る", labelText: misoSoup[indexPath.row])
        cell.button.addTarget(self, action: #selector(tapCellButton(_:)), for: .touchUpInside)
        //タグを設定
        cell.button.tag = indexPath.row
        return cell
    }

tap時のイベントメソッドを修正

タップした際にボタンが何番目のcellのボタンなのかが取得できるようになったのでメソッドの中身を書き換えました。

    @objc func tapCellButton(_ sender: UIButton) {
        print(misoSoup[sender.tag])
    }
Swift

次の記事

Realmを使ってみた