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

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

ただいまの
回答率

88.77%

segueを利用しない データの引き渡し

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 437

Larry

score 28

前提・実現したいこと

セルをタップ → セルの中身をcontainerviewのラベルに表示

イメージ説明

ContainerViewにtableViewのデータを渡したいです。

今までは画面遷移の際はsegueを利用して行っていたので
performSegueでデータを渡していましたが、今回はそれではできないため困っています。
セグエを利用しないデータの引き渡しで調べましたが、行き詰まっています。

教えていただければ幸いです。どうぞよろしくお願いします。

該当のソースコード

import UIKit

let kansaiList1 = [(title: "0", items: ["ねずみ", "うし", "とら", "うさぎ", "りゅう","おおかみ"]),
                  (title: "1", items: ["へび", "うま","ひつじ","さる","とり","いぬ","いのしし","ねこ","しまうま"]),
                  (title: "2", items: ["やぎ","くま","しろくま","こぶら","ごりら","ぶた","ぞう","おおかみ"]),

]

var tableSection1 = 0
var tableRow1 = 0

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate  {

    @IBOutlet var tableView: UITableView!


    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self


    }

    //セクションの数返す
    func numberOfSections(in tableView: UITableView) -> Int {
        return kansaiList1.count
    }
    // セクションのタイトルを返す。
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return kansaiList1[section].title
    }
    //セルの数を返す
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return kansaiList1[section].items.count
    }

    //セルに値を設定する
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // セルを取得する
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        // セルに表示する値を設定する
        cell.textLabel!.text = kansaiList1[indexPath.section].items[indexPath.row]

        return cell
    }

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

        //ここでそれっぽいことを調べてコピペしたがわからない
        //let storyboard: UIStoryboard = self.storyboard!
        //let nextView = storyboard.instantiateInitialViewController() as! ContainerView

        tableSection1 = indexPath.section
        tableRow1 = indexPath.row

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

_______________________________________________________________________________________

//遷移先のView
import UIKit

class ContainerView: UIViewController {

    @IBOutlet var kansaiLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

         kansaiLabel.text = kansaiList1[tableSection1].items[tableRow1]

    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • fuzzball

    2019/04/11 09:15 編集

    >>今までは画面遷移の際はsegueを利用せずに行っていたので
    >>performSegueでデータを渡していましたが、
    segueを利用していないのに、performSegueでデータを渡すってどういうことでしょうか?

    「利用せずに」ではなく「利用して」の書き間違いでしょうか?

    キャンセル

  • Larry

    2019/04/11 13:35

    すみません。誤字りました。おっしゃる通り「利用して」の間違いです。

    キャンセル

回答 1

0

func prepare(for segue: UIStoryboardSegue, sender: Any?)の segue.destination でcontainerViewの中身のUIViewControllerが捕まえられるので、それをインスタンス変数に持っておけばいいです。

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    ////
    private var detailView: ContainerNoNakaNoViewController?   // set your UIViewController's subclass

    /////

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

        detailView = segue.destination as? ContainerNoNakaNoViewController
    }

    /////
}

追記

根本的なことが分かっていないようなので、ちょっと長めの無駄話。

UIViewControllerについて

UIViewControllerのリファレンスを読んでみましょう

You rarely create instances of the UIViewController class directly. Instead, you subclass UIViewController and add the methods and properties needed to manage the view controller's view hierarchy. 

(超訳)
UIViewControllerをサブクラス化せずに使うことはめったにない。サブクラス化して便利に使え。

A view controller’s main responsibilities include the following:
     ・Updating the contents of the views, usually in response to changes to the underlying data.
     ・Responding to user interactions with views.
     ・Resizing views and managing the layout of the overall interface.
     ・Coordinating with other objects—including other view controllers—in your app.

(超訳)ViewControllerの役割は

  • 持ってるデータを表示する
  • ユーザーアクションへの対応
  • ビューレイアウト管理
  • ほかのオブジェクトとの連携

外側から考える

ViewControllerの役割をその外から考えると、ViewControllerにデータを与えると詳細はわからないけどユーザーにそれが表示されるということです。
ViewControllerの外からデータがどのように表示されるかを考えてはいけません。それはViewControllerの仕事です。

あなたがやるべきこと

ContainerViewがやるべき仕事は、一つの(title: String, items: [String])を保持し、それを表示することです。
そのリストを持ってはいけません
そしてそれが変更されたときは、新しい内容を表示しなければなりません。
そのようにプログラムを組みましょう。

テーブルのセルが選択されたとき、ContainerViewに表示すべきデータを渡すのがViewControllerの役割です。
それ以上のことをしてはいけません。
そのようにプログラムを組みましょう。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/12 00:53

    度々回答ありがとうございます。(遷移先のコードを追加しました)

    確認なのですが、流れとしては
    tabbleviewのセルをタップ→タップしたときのセクションとセルの情報を取得→その情報を遷移先に渡す→ラベルに表示。
    で合っていますよね?

    そしてもう一つ質問ですが、そもそもの話で申し訳ないのですが、「segue.destination でcontainerViewの中身のUIViewControllerが捕まえ、それをインスタンス変数として持つ」 ということがわかりません。

    遷移先のviewを取得してそれをどのように扱えば良いのかも少し詳しく教えていただけるとありがたいです。

    よろしければ教えてください。お願いします。

    キャンセル

  • 2019/04/12 18:53

    追記しました

    キャンセル

  • 2019/04/12 21:10

    回答、解説ありがとうございます。しばらく考えてみます。

    キャンセル

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

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

関連した質問

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