前提・実現したいこと
こんにちは。
初めて質問させていただきます。
食事管理アプリを作成する際に、③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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/26 06:33