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

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

ただいまの
回答率

87.96%

TableView セル選択で画面遷移後 戻ると順番がクリア

解決済

回答 2

投稿 編集

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

score 6

閲覧ありがとうございます。
以前質問させて頂きサンプルコードで勉強させていただいております。

前提・実現したいこと

TableViewCell一覧から選択 → 画面遷移先で戻るボタン → TableViewCell一覧に戻りたい

上記を実現したいです。

@IBAction  func unwindP(for unwindSegue: UIStoryboardSegue, towards subsequentVC: UIViewController) { }


現在はこちらを遷移元Viewに記述し戻ることは出来ています。

発生している問題

戻るボタンを押してTableViewCell一覧に戻ると、個別に用意してある別のCellが表示一覧に混じってしまいます。

遷移元ViewController
イメージ説明z

トマトを選択↓

遷移前
イメージ説明

tカスケード乳剤を選択↓

遷移先SecondView
イメージ説明

go backで戻ると↓

イメージ説明

該当のソースコード

遷移元ViewController

import UIKit

class ViewController: UITableViewController {


    var getCell: Int!

    var chosenCell: Int! = 0

    let tomatoArray: [String] = ["tアニキ乳剤","tカスケード乳剤","tグレーシア乳剤","tコテツフロアブル","tトランスフォームフロアブル","tコルト顆粒水和剤","tスピノエース顆粒水和剤"]

    let suikaArray: [String] = ["su農薬名1","農薬名2","農薬名3","農薬名4","農薬名5","農薬名6","農薬名7"]

    let ninzinArray: [String] = ["n農薬名1","農薬名2","農薬名3","農薬名4","農薬名5","農薬名6","農薬名7"]

    let rakkaseiArray: [String] = ["r農薬名1","農薬名2","農薬名3","農薬名4","農薬名5","農薬名6","農薬名7"]

    let zyagaArray: [String] = ["z農薬名1","農薬名2","農薬名3","農薬名4","農薬名5","農薬名6","農薬名7"]

    let aopapaiyaArray: [String] = ["a農薬名1","農薬名2","農薬名3","農薬名4","農薬名5","農薬名6","農薬名7"]

    let soramameArray: [String] = ["so農薬名1","農薬名2","農薬名3","農薬名4","農薬名5","農薬名6","農薬名7"]

    var activeArray: [String] = []

    var tableViewCells: [String] = ["TableViewCellFirst", "TableViewCellSecond"]

    @IBAction  func unwindP(for unwindSegue: UIStoryboardSegue, towards subsequentVC: UIViewController) {

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        //getCell = Int.random(in: 0...6)

        self.tableView.delegate = self
        self.tableView.dataSource = self

        switch getCell {
        case 0:
            activeArray = tomatoArray
        case 1:
            activeArray = suikaArray
        case 2:
            activeArray = ninzinArray
        case 3:
            activeArray = rakkaseiArray
        case 4:
            activeArray = zyagaArray
        case 5:
            activeArray = aopapaiyaArray
        case 6:
            activeArray = soramameArray
        default:
            break
        }

    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return activeArray.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let getCellType = chosenCell

        switch getCellType {
        case 0:
            var cell = self.tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath) as! TableViewCellFirst
            cell = doSomethingWithTableViewCellFirst(cell: cell, index: indexPath.row)
            return cell
        case 1:
            var cell = self.tableView.dequeueReusableCell(withIdentifier: "Cell2", for: indexPath) as! TableViewCellSecond
            cell = doSomethingWithTableViewCellSecond(cell: cell, index: indexPath.row)
            return cell
        case 2:
            var cell = self.tableView.dequeueReusableCell(withIdentifier: "Cell3", for: indexPath)  as! TableViewCellThird
            cell = doSomethingWithTableViewCellThird(cell: cell, index: indexPath.row)
            return cell
        case 3:
            var cell = self.tableView.dequeueReusableCell(withIdentifier: "Cell4", for: indexPath)  as! TableViewCellForth
            cell = doSomethingWithTableViewCellFourth(cell: cell, index: indexPath.row)
            return cell
        case 4:
            var cell = self.tableView.dequeueReusableCell(withIdentifier: "Cell5", for: indexPath)  as! TableViewCellFifth
            cell = doSomethingWithTableViewCellFifth(cell: cell, index: indexPath.row)
            return cell
        case 5:
            var cell = self.tableView.dequeueReusableCell(withIdentifier: "Cell6", for: indexPath)  as! TableViewCellSixth
            cell = doSomethingWithTableViewCellSixth(cell: cell, index: indexPath.row)
            return cell
        default:
            var cell = self.tableView.dequeueReusableCell(withIdentifier: "Cell7", for: indexPath)  as! TableViewCellSeventh
            cell = doSomethingWithTableViewCellSeventh(cell: cell, index: indexPath.row)
            return cell
        }

    }

    func doSomethingWithTableViewCellFirst(cell: TableViewCellFirst, index: Int) -> TableViewCellFirst {
        cell.textLabel!.text = activeArray[index]
        cell.mylabel!.text = "これは「TableViewCellFirst」です"
        return cell
    }

    func doSomethingWithTableViewCellSecond(cell: TableViewCellSecond, index: Int) -> TableViewCellSecond {
        cell.textLabel!.text = activeArray[index]
        cell.mylabel!.text = "これは「TableViewCellSecond」です"
        return cell
    }

    func doSomethingWithTableViewCellThird(cell: TableViewCellThird, index: Int) -> TableViewCellThird {
        cell.textLabel!.text = activeArray[index]
        cell.mylabel!.text = "これは「TableViewCellThird」です"
        return cell
    }
    func doSomethingWithTableViewCellFourth(cell: TableViewCellForth, index: Int) -> TableViewCellForth {
        cell.textLabel!.text = activeArray[index]
        cell.mylabel!.text = "これは「TableViewCellForth」です"
        return cell
    }
    func doSomethingWithTableViewCellFifth(cell: TableViewCellFifth, index: Int) -> TableViewCellFifth {
        cell.textLabel!.text = activeArray[index]
        cell.mylabel!.text = "これは「TableViewCellFifth」です"
        return cell
    }
    func doSomethingWithTableViewCellSixth(cell: TableViewCellSixth, index: Int) -> TableViewCellSixth {
        cell.textLabel!.text = activeArray[index]
        cell.mylabel!.text = "これは「TableViewCellSixth」です"
        return cell
    }
    func doSomethingWithTableViewCellSeventh(cell: TableViewCellSeventh, index: Int) -> TableViewCellSeventh {
        cell.textLabel!.text = activeArray[index]
        cell.mylabel!.text = "これは「TableViewCellSeventh」です"
        return cell
    }




    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        chosenCell = indexPath.row
        performSegue(withIdentifier: "showVedgi" , sender: nil)

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        let secondViewController = segue.destination as! SecondViewController

        secondViewController.getCell = chosenCell
        secondViewController.vedgiName = activeArray[chosenCell]
    }



}


遷移先SecondViewController

import UIKit

class SecondViewController: UIViewController {
    var getCell: Int = 0
    var vedgiName: String = ""

    @IBOutlet weak var localLabel: UILabel!



    override func viewDidLoad() {
        super.viewDidLoad()
        print(getCell)
    }

    override func viewWillAppear(_ animated: Bool) {
        print(vedgiName)
       localLabel.text = vedgiName



    }
}

試したこと

混じってしまうCellはIndexPathが関係して引っ張られてきていると思うのですが、どう対処すればよいかわかりません。
UserDefaultsでセルの選択状態を保存して再表示するのでしょうか?
調べたのですが、いまいち同じ状況がヒットしませんでした。

どなたかご教示頂けば幸いです。
どうぞよろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • weekplane

    2019/12/28 05:26 編集

    遷移をしない,元々の画面のスクショがあればわかりやすいかもです.(戻り画面VCのオリジナル)

    キャンセル

  • hirasho

    2019/12/28 06:06

    weekplane 様
    スクショを追加致しました。
    ご確認よろしくお願い致します。

    キャンセル

回答 2

checkベストアンサー

+1

ViewControllerの中にgetCellとchosenCellという2つのプロパティがあり、getCellはどの野菜(どの種類のセル)の農薬一覧を表示するのかを表し、chosenCellは表示中の農薬一覧の中で、どの農薬を選択したかを表しているものだと思いますが、cellForRowAtのdelegateメソッドの中でchosenCellの値を元に表示する農薬一覧(表示するセルの種類)を決めているのが誤っていると思います。

「tカスケード乳剤」を選択したらchosenCellの値は1になりますから、画面を戻った時に既に表示されているセル(TableViewCellFirst)はそのまま表示されたままですが、下にスクロールして続きのセルを表示するとchosenCellの値が1になっているためTableViewCellSecondのセルが表示されてしまうと思います。

cellForRowAtのdelegateメソッドの中で、chosenCellではなく、getCellの値を元に表示するセルを決めればうまくいきそうに思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/28 21:42

    TakeOne様

    ご回答ありがとうございます。
    ご指摘通り、choseCellをgetCellに変更したところ理想通り動作しました!!

    「「tカスケード乳剤」を選択したらchosenCellの値は1になりますから、画面を戻った時に既に表示されているセル(TableViewCellFirst)はそのまま表示されたままですが、下にスクロールして続きのセルを表示するとchosenCellの値が1になっているためTableViewCellSecondのセルが表示されてしまう」

    セル自体がdequeueReusableCellで再利用されているため、元のセルは表示されたままで上下にスクロールした際に別のセルがそこで初めて表示されてしまっていたのですね。理解できてスッキリしました。

    貴重なお時間をいただきまして、誠にありがとうございました。

    キャンセル

0

遷移先VCでgo backボタンを押したら元の画面に戻るように,
遷移先VCに

@IBAction func 関数名(_ sender: Any) {
     dismiss(animated: true, completion: nil)  
 }


を追加するのは試しましたか?(※go backボタンにoutket接続をする)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/28 06:49

    ご回答ありがとうございます。

    dismissメソッドは試したのですが、遷移元VCまで二段階戻ってしまいます。
    アニキ乳剤、カスケード乳剤...と表示されている一覧に戻りつつ、順番がバラバラにならない方法を知りたいです。判りづらい質問で大変申し訳ありません。

    キャンセル

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

  • ただいまの回答率 87.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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