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

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

ただいまの
回答率

90.51%

  • Xcode

    4916questions

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

  • Swift 2

    1338questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 586

Tomzy

score 92

質問の概要

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が表示されます。なぜでしょうか。どう対処したらよいでしょうか。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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/21 09:14

    Take One さん
    こんにちは。
    早速ありがとうございました。
    あっそうかと思い、やってみました。おっしゃる通りエラーはでず、意図したとおりの遷移→表示がされました。

    また、printのコードもView Controllerに移しましたら、ループ的なプリントはなくなりました。もう少し時間を掛けていろいろ試してみようと思います。

    まだ、まだダメですが大分わかってきました。本当にありがとうございました。

    場を提供してくださるteratailさんに感謝です。

    キャンセル

同じタグがついた質問を見る

  • Xcode

    4916questions

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

  • Swift 2

    1338questions

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

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