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])
}