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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

1385閲覧

遷移無しの値の渡し方を教えてください。

Ytan

総合スコア39

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グッド

0クリップ

投稿2020/08/07 10:29

実現したいこと

VieControllerにあるTableVieのcellをタップするとcellに入っている情報をRegisterViewControllerで表示することは前までの質問でできたのですが、新たにListViewControllerを作りRegisterViewControllerの右上のボタンをタップするとListViewControllerのcellに表示したいです。

ソースコード一覧

ViewController

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var table:UITableView! 6 var items:[Item] = [Item]() 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 table.register(TableViewCell.nib(), forCellReuseIdentifier: TableViewCell.identifier) 12 13 table.delegate = self 14 table.dataSource = self 15 16 self.setupItems() 17 } 18 19 func setupItems(){ 20 items = [Item(name:"a",date:"1"),Item(name:"b",date:"2"),Item(name:"c",date:"3"),Item(name:"d",date:"4"),Item(name:"e",date:"5"),] 21 } 22} 23 24extension ViewController: UITableViewDelegate,UITableViewDataSource{ 25 26 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 27 return items.count 28 } 29 30 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 31 let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell 32 cell.setcell(item: items[indexPath.row]) 33 return cell 34 } 35 36 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 37 tableView.deselectRow(at: indexPath, animated: true) 38 performSegue(withIdentifier: "registerControl", sender: items[indexPath.row]) 39 } 40 41 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 42 if segue.identifier == "registerControl"{ 43 let nextVC: RegisterViewController = segue.destination as! RegisterViewController 44 if let selecteditems = sender as? Item{ 45 nextVC.item = selecteditems 46 } 47 } 48 } 49}

RegisterViewController

1import UIKit 2 3class RegisterViewController: UIViewController { 4 5 @IBOutlet weak var registeredNameLabel: UILabel! 6 @IBOutlet weak var registeredDateLabel: UILabel! 7 @IBOutlet var addListButton:UIBarButtonItem! 8 9 var item: Item! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 //MovieListに追加するためのボタン 15 addListButton = UIBarButtonItem(title: "リストへ追加", style: .plain, target: self, action: #selector(addListButton(_:))) 16 self.navigationItem.rightBarButtonItems = [addListButton] 17 18 registeredNameLabel.text = item.name 19 registeredDateLabel.text = item.date 20 } 21 //ボタン呼び出し 22 @objc func addListTapped(_ sender: UIBarButtonItem){ 23 print("Tapped") 24 performSegue(withIdentifier: "addItemToList", sender: item) 25 } 26 //Listへ追加する情報の受け渡し(今回の疑問点) 27 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 28 if segue.identifier == "addItemToList"{ 29 let nextListVC: ListViewController = segue.destination as! 30ListViewController 31 if let registeredItems = sender as? [Item]{ 32 nextListVC.list = registeredItems 33 } 34 } 35 } 36} 37

ListViewController

1import UIKit 2 3class ListViewController: UIViewController{ 4 5 var list:[Item] = [] 6 var allList:[Item] = [] 7 var selectedList:[Item] = [] 8 9 @IBOutlet weak var table:UITableView! 10 11 @IBAction func segmentSelcted(_ sender: UISegmentedControl) { 12 13 switch sender.selectedSegmentIndex { 14 case 0: 15 list = allList 16 case 1: 17 list = selectedList 18 default: 19 fatalError("caseでカバーできません") 20 } 21 table.reloadData() 22 } 23 24 override func viewDidLoad() { 25 super.viewDidLoad() 26 27 table.delegate = self 28 table.dataSource = self 29 } 30} 31 32extension ListViewController:UITableViewDelegate,UITableViewDataSource{ 33 34 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 35 list.count 36 } 37 38 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 39 let cell = tableView.dequeueReusableCell(withIdentifier: ListTableViewCell.identifier, for: indexPath) as! ListTableViewCell 40 cell.setcell(item: list[indexPath.row]) 41 return cell 42 } 43} 44

疑問点

質問1: RegisterViewControllerのaddListButtonが押された時にListViewControllerのlistに値を渡たいのですが遷移した値を渡す方法しか調べても出てこないので普通に代入すれば良いですか?

質問2: 今は仮に遷移する処理を書いたのですが、遷移はできるもののListViewControllerのcellに値は表示されていないのですがどうすれば良いですか?
ListViewControllerでTableViewCellを使っているのでそちらも載せておきます。

ListTableViewCell

1import UIKit 2 3class ListTableViewCell: UITableViewCell { 4 5 @IBOutlet var listNameLabel:UILabel! 6 @IBOutlet var listDateLabel:UILabel! 7 8 override func awakeFromNib() { 9 super.awakeFromNib() 10 // Initialization code 11 } 12 13 override func setSelected(_ selected: Bool, animated: Bool) { 14 super.setSelected(selected, animated: animated) 15 } 16 17 static let identifier = "TableViewCell" 18 19 static func nib() -> UINib{ 20 return UINib(nibName: "TableViewCell", bundle: nil) 21 } 22 23 func setcell(item:Item){ 24 self.listNameLabel.text = item.name as String 25 self.listDateLabel.text = item.date as String 26 } 27 28} 29

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

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

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

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

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

TsukubaDepot

2020/08/07 12:02

今回の場合、「遷移無しで値を渡す」必要性というのがあるのかいまいち良く想像できません。 言い換えれば、「違う ViewController をインスタンス化し値を渡すものの、画面には表示しない」ということになるわけですが、その必要性というのがピンと来ないので、想定している場面をもう少し詳しく追記していただけないでしょうか。
Ytan

2020/08/07 13:02

こちらはViewControllerでAPIで取得したデータを検索して得た情報をcellを押してRegisterViewで登録するようなアプリの仮タイプとなっています。 またViewControllerとListViewControllerはTabBar移動をできるようにしています。 本番アプリの時ViewControllerのListをいくつも連続で登録したいとなった時毎回登録のたびにListViewControllerに遷移されると不便だと思いました。RegisterViewはいわばViewControllerの付属機能となっているのでListViewControllerからNavigationへ戻ることもしたくないと思っているため、登録したらListViewControllerに情報の入ったcellは追加されるも遷移せずにそのままViewControllerにのみ戻れるようにしたいです。
fjis

2020/08/11 06:33

単に複数の値を一度に渡したいだけでしょう。 配列もしくは、それに準じたものを渡すことを考えてください。
guest

回答1

0

ベストアンサー

複数の View 間でデータを共有したいというのであれば、解決方法の一つはデータを管理する Singleton クラスを作る方法を採用することだと思います。

上記質疑の自己回答にもありますが、TabBar Controller を使う予定であれば、切り替えて表示したい View Controller のインスタンスは生成されているので、下記のような方法で直接アクセスすることも可能です(が、UI部品については初回表示までロードされないようなので、リンク先をご覧になってご理解ください)。

ほかにも、userDefault や Realm などのデータ永続化を利用する方法など色々ありそうに感じますが、いずれにせよ複数の View でデータを共有するのであれば、一度設計を見直した方がいいかもしれません。

投稿2020/08/07 21:34

TsukubaDepot

総合スコア5086

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

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

Ytan

2020/08/08 05:58

一つはデータというのは前の質問に記載したitemsModelのItemClassがSingleton Classとしてなりうるということですか? それともRegiserViewのViewControllerから情報を受け取ったitemのインスタンスを単一のデータにするということですか? Item型をどのviewでも使っているのでSingletonを使った方が良い気がするのですが、少し理解が難しいです。
TsukubaDepot

2020/08/10 04:02

https://ja.stackoverflow.com/questions/69368/userdefaults%e3%81%a7%e4%bf%9d%e5%ad%98%e3%81%97%e3%81%9f%e5%80%a4%e3%82%92%e5%88%a5%e3%81%aeview%e3%81%a7%e8%aa%ad%e3%81%bf%e8%be%bc%e3%81%bf%e3%81%9f%e3%81%84 上記でもご質問されているようで、そちらの方が話が進んでいるので、こちらは終了ということでよろしいでしょうか。 ちなみに、このようなマルチポストは一般的には好まれません。色々理由はあると推測されますが、一番は回答者のリソースを無駄遣いすることになるからです。 しかし、いろいろな方のご意見を伺いたいと言う気持ちも否定できませんので、もしマルチポストするのであればその旨を事前に告知するようお願いします。
Ytan

2020/08/11 05:48

ご説明なく話を進めてしまいすみません。回答者様の親切心を無駄にするような形になってしまい申し訳ありません。何でもかんでも質問せずに自分で調べて自走できたら良いのですが、まだまだ理解も乏しく誰かに頼りきりとなってしまっていました。いつもご回答をいただき学ぶことも増えてきているので大変ありがたく思っております。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問