質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

847閲覧

カスタムセルでセクション内のセル別のアクション

sumire06

総合スコア15

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2020/03/01 12:32

tableviewのカスタムセルでセル内のボタンを押すとアクションがおこるということを行いたいです。
セクションなしのセルですと、タグをつけてセルごとのアクションを起こすことができたのですが、
セクションを使うことになり、やり方がわかりません。
「カスタムセルでセクションの中のセルをタップしたときにセル別のアクションを起こす」 とき
どのようなやり方があるのかを教えていただきたいです。

swift

1func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 2 //Cellの内容を設定する。 3 let cell = tableViewS.dequeueReusableCell(withIdentifier: "CellS", for: indexPath) as! TableViewCellS 4 cell.delegate = self 5 6 7 cell.button.tag = indexPath.row 8 9 if indexPath.section == 0 { 10 cell.textLabel?.text = milk[indexPath.row] 11 }else if indexPath.section == 1{ 12 cell.textLabel?.text = sweets[indexPath.row] 13 }else if indexPath.section == 2{ 14 cell.textLabel?.text = syrup[indexPath.row] 15 } 16 17 return cell 18```swift 19 20 21 22

@IBAction func pushCellButton(_ sender: UIButton) {
// ★ デリゲート実行

print(sender.tag) if button.tag == 0 { tapCount += 1 if tapCount % 2 != 0 { self.delegate?.recViewControllerDoSomething(add: 80) button.backgroundColor = .lightGray }else if tapCount % 2 == 0 {...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

  1. カスタムセルにsectionを示す変数を追加して、それを用いる。
  2. button以外のUIViewtagを使う。(例えばcell.tagなど)

前者がオススメで、後者はあまり褒められた方法ではないです。

カスタムセルを用意するまでもないような場合にtagを用いると便利ですが、せっかくカスタムセルを作っているのなら、indexPath.rowindexPath.sectionを保持する変数を、分かりやすい名前で用意して使うと良いと思います。

UIViewを継承しているクラスはどれもtagをもっているのでそれを使う後者は簡単なのですが、どのtagが何に使われているのかコードから分かりにくいという問題があります。しかし、カスタムセルを作らなくてもよいので、コメントなどで補足したりして使うとよいかと思います。

投稿2020/03/02 07:18

eytyet

総合スコア803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sumire06

2020/03/02 11:18

ありがとうございます!! 前者をやってみたいと思います。 別のファイルに「let sectionRow = ["","",""]」を用意しています。 これは使用するのでしょうか? 「sectionを表す変数の追加」というのを具体的に教えていただきたいです。 indexPath.section を使用できるようにしたいです。 よろしくお願いいたします。
eytyet

2020/03/02 12:46 編集

TableViewCellSがカスタムセルなので、そのクラス定義のなかに、sectionとrowを保持する変数を用意すると良いと思います。 let sectionRowはletで定数なので、あとから変更できません。 例えば var itemKind: Int // sectionを保存する。milkやsweetsを表すのでkindとしてみました。 var itemIndex: Int // rowを保存する。何番目かを示しているのでindexにしてみました。 または単純に、 var indexPath: Indexpath // セルのindexPathを現す表す といった変数をTableViewCellSのプロパティとして定義して使うとよいと思います。 用意した変数に、コードとして提示しているtableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 関数のなかで、indexPathの値をcell.indexPath = indexPathとしたり、cell.itemKind = indexPath.section として代入します。 その値は、pushCellButton関数のなかで取得して使うことができます。
sumire06

2020/03/02 13:23

できました!! とても助かりました。 ご丁寧に教えていただき、ありがとうございます。
guest

0

セルにプロパティをもたせると、セルが編集された際に面倒なことになる可能性があるので、
まあ、試してないんであれですが、

swift

1 2protcol HogeDelegate: class { 3 4 func btnOnCellDidTap(_ cell: UITableViewCell) 5 6 // 即時にセクションがほしいならだけど、邪道かな? 7 func btnOnCellDidTap(_ cell: UITableViewCell) -> Int? 8 9} 10 11 12class CustomCell: UITableViewCell { 13 14 weak var hogeDelegate: HogeDelegate? 15 16 @IBAction func btnDidTap(_ sender: UIButton) { 17 18 hogeDelegate?.btnOnCellDidTap(self) 19 20 } 21 22 @IBAction func btnDidTapAndDoSomethingHere(_ sender: UIButton) { 23 guard let section = hogeDelegate?.btnOnCellDidTap(self) else { return } 24 // ここでなんかの処理 25 } 26} 27 28 29class ViewController: UIViewController, HogeDelegate { 30 31 @IBOutlet weak var sampleTableView: UITableView! 32 33 34 func tableView(_ tableView: UITableView, 35 cellForRowAt indexPath: IndexPath) -> UITableViewCell { 36 37 let cell = ...... 38 cell.hogeDelegate = self 39 return cell 40 } 41 42 43 func btnOnCellDidTap(_ cell: UITableViewCell) { 44 45 let indexPath = sampleTableView.indexPath(for: cell) 46 47 // 何も設定しなくても、ここでセクション取れない? 48 let section = indexPath?.section 49 } 50 51 func btnOnCellDidTap(_ cell: UITableViewCell) -> Int? 52 return sampleTableView.indexPath(for: cell).section 53 } 54

投稿2020/03/02 13:22

編集2020/03/02 15:33
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問