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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

1回答

1198閲覧

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

Larry

総合スコア28

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

2クリップ

投稿2019/04/10 15:50

編集2022/01/12 10:55

前提・実現したいこと

セルをタップ → セルの中身を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] } }

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

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

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

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

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

fuzzball

2019/04/11 00:36 編集

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

2019/04/11 04:35

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

回答1

0

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

swift

1 2class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 3 //// 4 private var detailView: ContainerNoNakaNoViewController? // set your UIViewController's subclass 5 6 ///// 7 8 func prepare(for segue: UIStoryboardSegue, sender: Any?) { 9 10 detailView = segue.destination as? ContainerNoNakaNoViewController 11 } 12 13 ///// 14}

追記

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

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/11 02:48

編集2019/04/12 09:52
MasakiHori

総合スコア3384

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

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

Larry

2019/04/11 11:53

回答ありがとうございます。 すみません、よく分からなかったです。 「func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) にはなんと記載すればいいでしょうか
MasakiHori

2019/04/11 12:19

画像の右側の黄色のビューを持つViewControllerが取得できるので、そのViewControllerに対し、選択されたセルの中身を表示するように指示してください
Larry

2019/04/11 15:53

度々回答ありがとうございます。(遷移先のコードを追加しました) 確認なのですが、流れとしては tabbleviewのセルをタップ→タップしたときのセクションとセルの情報を取得→その情報を遷移先に渡す→ラベルに表示。 で合っていますよね? そしてもう一つ質問ですが、そもそもの話で申し訳ないのですが、「segue.destination でcontainerViewの中身のUIViewControllerが捕まえ、それをインスタンス変数として持つ」 ということがわかりません。 遷移先のviewを取得してそれをどのように扱えば良いのかも少し詳しく教えていただけるとありがたいです。 よろしければ教えてください。お願いします。
Larry

2019/04/12 12:10

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問