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

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

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

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

1312閲覧

テーブルビューに2段のラベルを設けるプロジェクト⇒07 sectionつきcellの選択による表示方法

Tomzy

総合スコア104

Xcode

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/09/20 12:37

###質問の概要
teratailさんのおかげでTableViewの表示が多彩になってきました。
従来第1画面はsectionなしのcellで、cell番号もひとつの通し番号でした。section付きの図入りcellに変更しましたら、第2画面であるTableView02の表示内容がずれてしまいました。

つまり、sectionで区切られたものですから、タップされた行番号がくるい、第2画面の表示がくるってしまいました。

###関係スクリーンショット3枚
従来のセクションなしの第1画面
イメージ説明

セクションを使い画像を入れた第1画面
イメージ説明

遷移して、詳細TableView02を表示する第2画面
イメージ説明

###発生した現象
第2画面のTableView02では、第1画面のView Controllerでの選択セル番号を読んで、
texts00からtexts06までのArray記載のテキストを表示していました。
従って、section入りのcell番号は

00,01,02,03,04,05,06ではなく、
section01 の00,01,02
section02 の00,01,02,03

というcell番号に対応したテキストが反映されてしまいました。
つまり、動画の説明とテキストの説明の3項目が同じ画面になってしまいました。
section02のcell03をタップするとsection02のcell01が表示されました。

###対策として実施したコーディング
if文を使いsectionごとにcell番号を指示し、「テキストによる説明」のところにはcell番号に+3を入れました。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell //cell.label1.text = texts[selectedIndexPathInViewController.row][indexPath.row] //参考→ section == 0 は赤帯の注釈につかったのでスキップしました。 ////「テキストによる説明」部分のcell番号設定 if selectedIndexPathInViewController.section == 1 { //一段目のために選ばれた行番号をプリントする print("タップされた section1の インデックスパス:\(indexPath.row)") cell.label1.text = texts[selectedIndexPathInViewController.row][indexPath.row] cell.label2.text = subtexts[selectedIndexPathInViewController.row][indexPath.row] //二段目のために選ばれた行番号をプリントする print("タップされた section1の2段用 インデックスパス:\(indexPath.row)") print("section1がタップされた") } //「テキストによる説明」部分のcell番号設定 if selectedIndexPathInViewController.section == 2 { //タップされた第1画面のcellに応じた表示 cell.label1.text = texts[selectedIndexPathInViewController.row][indexPath.row+3] cell.label2.text = subtexts[selectedIndexPathInViewController.row][indexPath.row+2] //参考→ 本来はrow+3とすべきところ、row+2 としたのは、ずれを生じさせて、コードが機能しているか確かめるためのものです。 print("section2がタップされた") //二段目のために選ばれた行番号をプリントする print("section2がタップされ、1段目の番号:\(indexPath.row+3)") print("section2がタップされ、2段目の番号:\(indexPath.row+2)") } else{ return cell }

###発生したエラー

ビルドは成功するのですが、第1画面の下段の「テキストによる説明」をタップすると
fatal error: Index out of range
がでて落ちます。

なお、上記コードのindexPath.row+3 や indexPath.row+2 の+3 と+2を消すとエラーにならず表示されますが、表示にずれは生じています。

###コードに書いたprint結果からの考察
下記のスクリーンショットのごとく、
section01(動画のセクション)をタップした場合はエラーはでず、printも正常に機能しています。
なお、1行目のタップされたセルのインデックスパス:0は View Controllerのコードによるものです。
イメージ説明

section02(テキストのセクション)をタップすると、下記のスクリーンショットのごとくなぜか何度もタップしたような表示がでて、最後にfatal error: Index out of rangeが表示されます。

イメージ説明

###質問

一度しかタップしないのに何度もタップしたような表示がでて、最後にfatal error: Index out of rangeが表示されます。なぜでしょうか。どう対処したらよいでしょうか。

長いコード付きの質問で恐縮ですが、教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問に示されたコードは、第2画面のテーブル表示のコードですよね?
で、その処理は、第1画面(セクション付き画面)でタップされたセルをselectedIndexPathInViewControllerで引き継ぎ、そのselectedIndexPathInViewControllerで指定された行に対応する第2画面のテーブルを表示しているのですよね?

でしたら、+3するのはindexPath.row(第2画面の行)じゃなくてselectedIndexPathInViewController.row(第1画面の行)に対してです。
つまり
cell.label1.text = texts[selectedIndexPathInViewController.row][indexPath.row+3]
じゃなくて
cell.label1.text = texts[selectedIndexPathInViewController.row+3][indexPath.row]
じゃないですか?

一度しかタップしないのに何度もタップしたような表示が出るのは、printしている箇所がタップイベントが発生した箇所(第1画面のdidSelectRowAtIndexPath)じゃなくて、タップして遷移した先の第2画面のテーブルのセルを生成する処理(cellForRowAtIndexPath)だからです。セルを1個ずつ生成するたびにprintしているのですから複数表示されるのは当たり前です。

投稿2016/09/20 22:53

TakeOne

総合スコア6299

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

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

Tomzy

2016/09/21 00:14

Take One さん こんにちは。 早速ありがとうございました。 あっそうかと思い、やってみました。おっしゃる通りエラーはでず、意図したとおりの遷移→表示がされました。 また、printのコードもView Controllerに移しましたら、ループ的なプリントはなくなりました。もう少し時間を掛けていろいろ試してみようと思います。 まだ、まだダメですが大分わかってきました。本当にありがとうございました。 場を提供してくださるteratailさんに感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問