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

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

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

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

Swift

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

Q&A

1回答

679閲覧

(swift) protocolを使って2個前のViewControllerに値を渡したい

Ns.NAOKI

総合スコア0

Xcode

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

Swift

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

1グッド

0クリップ

投稿2021/06/26 04:40

前提・実現したいこと

こんにちは。
初めて質問させていただきます。

食事管理アプリを作成する際に、③SettingViewControllerの値を①RegistrationViewControllerのtableViewに反映させたいです。

流れ (1) ②SearchViewControllerのtableViewに検索した食品のデータを入れる。  (2)セルをタップし③SettingViewControllerで食品の摂取量の設定する。  (3)③SettingViewControllerで変更された食品のデータを①RegistrationViewControllerのtableViewに渡す。

上記の(3)の過程がうまくいかずに困っています。
ソースコードが長くなってしまい読みにくかかもしれませんが、解決方法をご教授板でければと思います。

イメージ説明

発生している問題・エラーメッセージ

エラーメッセージ  エラーメッセージは出ていませんが、①RegistrationViewControllerのtableViewに③SettingViewControllerの値が渡せません。

該当のソースコード

SettingViewController

1 func FoodsCalculation(){ 2 num = Double(intakeTextField.text!)! 3 carbNum = Double(carbLabel.text!)! / 100.0 * num 4 proteinNum = Double(proteinLabel.text!)! / 100.0 * num 5 fatNum = Double(fatLabel.text!)! / 100.0 * num 6 kcalNum = Double(kcalLabel.text!)! / 100.0 * num 7 8 var foodsModel = FoodsModel(foodName: foodName, carb: String(carbNum), protein: String(proteinNum), fat: String(fatNum), kcal: String(kcalNum)) 9 10 delegate?.getFoodsCalculationDelegate(food: foodsModel) 11 print(foodsModel) 12} 13 14 @IBAction func registerButton(_ sender: Any) { 15 FoodsCalculation() 16 17 18 let ViewControllersNum = navigationController!.viewControllers.count 19 self.navigationController?.popToViewController(navigationController!.viewControllers[2], animated: true) 20 21 } 22

RegistrationViewController

1import UIKit 2 3protocol AteFoodsDelegate { 4 func getFoodsDelegate(time:String, foods:[FoodsModel]) 5} 6 7class RegistrationViewController: UIViewController,UITextFieldDelegate,UITableViewDelegate,UITableViewDataSource,UIPickerViewDelegate,UIPickerViewDataSource,CalculationDelegate { 8 9 @IBOutlet weak var timeTextField: UITextField! 10 @IBOutlet weak var foodTableView: UITableView! 11 @IBOutlet weak var registrationButton: UIButton! 12 @IBOutlet weak var addMenuButton: UIButton! 13 14 var pickerView = UIPickerView() 15 16 let times = ["朝食","昼食","夕食","間食"] 17 var foods:[FoodsModel] = [] 18 var delegate:AteFoodsDelegate? 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 timeTextField.delegate = self 22 23 foodTableView.delegate = self 24 foodTableView.dataSource = self 25 pickerView.dataSource = self 26 pickerView.delegate = self 27 28 timeTextField.inputView = pickerView 29 30 timeTextField.layer.cornerRadius = 17 31 timeTextField.backgroundColor = .systemGray5 32 33 registrationButton.isEnabled = false 34 35 } 36 37 38// override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 39// let settingVC = storyboard?.instantiateViewController(identifier: "settingVC") as! SettingViewController 40// settingVC.delegate = self 41// print("prepare",foods) 42// } 43 override func viewWillAppear(_ animated: Bool) { 44 super.viewWillAppear(animated) 45 let settingVC = storyboard?.instantiateViewController(identifier: "settingVC") as! SettingViewController 46 settingVC.delegate = self 47 print("viewWill",foods) 48 49 } 50 51 52 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 53 return foods.count 54 } 55 56 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 57 let foodsCell = tableView.dequeueReusableCell(withIdentifier: "foodsCell", for: indexPath) 58 foodsCell.textLabel?.text = foods[indexPath.row].foodName 59 return foodsCell 60 } 61 62 func numberOfComponents(in pickerView: UIPickerView) -> Int { 63 return 1 64 } 65 66 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 67 return times.count 68 } 69 70 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 71 timeTextField.text = times[row] 72 timeTextField.resignFirstResponder() 73 } 74 75 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 76 return times[row] 77 } 78 79 80 func changeIsEnabled(){ 81 if timeTextField.text?.isEmpty == true || foods.isEmpty == true{ 82 registrationButton.isEnabled = false 83 }else{ 84 registrationButton.isEnabled = true 85 } 86 } 87 88 //③で作ったdelegateメソッド 89 func getFoodsCalculationDelegate(food: FoodsModel) { 90 foods.append(food) 91 print("registration",food) 92 foodTableView.reloadData() 93 } 94 95 @IBAction func addMenuButton(_ sender: Any) { 96 performSegue(withIdentifier: "search", sender: nil) 97 98 } 99 100 @IBAction func registrationButton(_ sender: Any) { 101 guard let time = timeTextField.text else {return} 102 delegate?.getFoodsDelegate(time: time, foods: foods) 103 dismiss(animated: true, completion: nil) 104 } 105 106} 107

試したこと

①RegistrationViewControllerでprepareやviewWillAppearで値を受け取れるかを試しましたが前者は①と③はsegueでは繋がっておらず、後者ではviewWillAppearが呼ばれた際のprint(foods)は空になっています。

また、③SettingViewControllerでregisterButtonが押された時にfoodsModelの中には食品のデータはちゃんと入っていることから、①RegistrationViewControllerに渡せていないのだと思うのですが解決策がわかりません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

GAKU_SAY👍を押しています

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

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

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

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

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

guest

回答1

0

ヒントですがprotocolを使用してみてください.

--追記--

データの送り先に

swift

1extension ~~~ViewController : protocol{ 2func ~~~~(){~~~~~~~~~~~} 3}

データを送るところに

class ---ViewController:UIViewController { var purotokoru: プロトコル名 func データを送る関数(){ purotokoru?.~~~~() } }

投稿2021/06/26 05:05

編集2021/06/29 01:14
GAKU_SAY

総合スコア23

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

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

Ns.NAOKI

2021/06/26 06:33

ご回答ありがとうございます。 ③SettingViewControllerに protocol CalculationDelegate { func getFoodsCalculationDelegate(food:FoodsModel) } このようなprotocolを書いてはいるのですが、他に解決策はございますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問