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

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

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

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

Swift

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

Q&A

解決済

1回答

1944閲覧

UITableView どのセルをタップ特定する方法について…

Blue0999

総合スコア148

Xcode

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

Swift

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

0グッド

0クリップ

投稿2016/04/26 02:13

編集2016/04/26 11:16

UITableView上のどのセルをタップしたかによりそれぞれ違う処理を行いたいので、タップしたセルを特定する方法について質問です。
メインストーリーボードで指定した1つのセルの識別子を使いセルを2つ作り、それぞれのtextLabel.textに別々の文字を入れた状態でセルをタップするとそれぞれ別々の処理を行いたいので、タップされたセルを特定する方法について教えてください。

具体的には2つのセルを持つUITableViewが配置された画面でセルをタップするとUITableViewが配置された次の画面に遷移するのですが押したセルにより次の画面のUITableViewに表示されるセルの内容を変更する、という事を実装したいのですが複数あるセルのうちどれを押したかを判定する方法について教えていください。

セルであるSoundOneをタップすると次の画面のUITableViewのセルを上からこのように表示
sound1
sound1
sound1

セルであるSoundTwoをタップすると次の画面のUITableViewのセルを上からこのように表示
sound2
sound2
sound2
↑これを実装しようと僕が試みた方法はセルをタップし、画面が遷移する時にセルのtextLabel.textを次の画面を担当するファイル内のクラスのプロパティsoundTypeに文字列として格納し、次の画面のUITableViewCellを戻り値とするメソッドTableViewのブロック内でif文を使いsoundTypeの中身によって返すセルを使い分けるというものです。

※最初の画面のTableView上のセルは2つあり一つ目のセルのtextLabel.textにはSoundOne、二つ目のセルのtextLabel.textにはSoundTwoが代入されている
※セルをタップするとViewController2が担当するビューへ遷移する事はメインストーリーボードで設定している。
※以下のコードでは説明に必要な部分だけを書いているものです。
ViewControllerファイル内

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let cell = myTableView1.dequeueReusableCellWithIdentifier("Cell")
let nextViewController = segue.destinationViewController as! ViewController2

if cell?.textLabel?.text == "SoundOne" { nextViewController.soundType = "SoundOne" } else { nextViewController.soundType = "SoundTwo" } }

※ soundTypeはViewController2ファイル内に定義されているプロパティ。
※ Cellはセルの識別子としてメインストーリボードで設定してある。

ViewController2ファイル内

var soundType: String = ""
var soundArray = [["sound1", "sound1", "sound1"], ["sound2", "sound2", "sound2"]]

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell2", forIndexPath: indexPath)

if soundType == "SoundOne" { cell.textLabel?.text = soundArray[0][indexPath.row] return cell } else { cell.textLabel?.text = soundArray[1][indexPath.row] return cell } }

このような方法で試してみたのですが失敗でした。おそらく原因はViewControllerファイル内のif cell?.textLabel?.text == "SoundOne"というコードでcell?.textLabel?.textの部分はタップしたセルのタイトルが格納されていると思っていたのですがprint()文で確認したところ、どうやら2つのセルのタイトルが格納されていたということだと思います。どうやったら押したセルを特定できるのかを教えてください!

ちゃんと説明できているのか自信がないので、不備な部分などがありましたらご指摘ください。

修正しました。
回答してくださった方により間違いを見つけましたので修正致します。
ViewController2内
if soundType == "Sound"

修正

if soundType == "SoundOne"

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

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

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

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

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

guest

回答1

0

ベストアンサー

#その1

とりあえずですが、ViewController2、

swift

1// if soundType == "Sound" { 2 if soundType == "SoundOne" {

#その2

ViewControllerのprepareForSegue、

swift

1let cell = myTableView1.dequeueReusableCellWithIdentifier("Cell")

ここでセルを生成してどうするんでしょうか?
セルのタップ時に処理をしたい場合は、willSelectRowAtIndexPathdidSelectRowAtIndexPathを使って下さい。

#その3

ViewControllerのprepareForSegueに渡されるsenderは、タップしたセル(UITableViewCell)なのでsender.textLabel.textでOneかTwoの判定を行って下さい。

投稿2016/04/26 02:48

編集2016/04/26 04:25
fuzzball

総合スコア16731

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

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

Blue0999

2016/04/26 03:04

申し訳ありません、僕の書き間違いです。修正しておきます。
Blue0999

2016/04/26 04:36 編集

let cell = myTableView1.dequeueReusableCellWithIdentifier("Cell")←これはセルのtextLabel.textを参照するためのものです。
Blue0999

2016/04/26 03:41 編集

ちなみに変数cellのtextLabel.textの中身を確認してみました。 print(cell?.textLabel?.text) 出力 nil Optional("SoundOne") Optional("SoundTwo")
fuzzball

2016/04/26 03:50

>>2つ上 コードはここに書かず回答に追記して下さい。 >>1つ上 どこで確認したのでしょうか?
Blue0999

2016/04/26 04:16

prepareForSegueでprint文を使いcellの中身を確認しました。
fuzzball

2016/04/26 12:32

回答に「その3」を追記していますが、見ていただけているでしょうか?
Blue0999

2016/04/27 00:20

追記ありがとうございます。今から予定があるので少し遅くなるかもしれませんが今日中には必ず読ませていただきます。
Blue0999

2016/04/27 08:08 編集

今、教えていただいた事をやってみたのですが希望通りの動きをしてくれました。それにしてもsenderでタップしたセルを参照できるのですね…とてもいい勉強になりました。教えていただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問