前提・実現したいこと
健康管理アプリを開発しています。
Double型の数値の配列データを、一つの画面を経由して、別の画面に送りたいのですが、
試したところ、うまく送れていないので、方法を教えてください。
該当のソースコード(ViewController)
Swift
1 2class ViewController: UIViewController { 3 4 var healthNumber1 = [Double]() 5 6 var heinetuDate = [Double]() 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 } 12 13 override func viewWillAppear(_ animated: Bool) { 14 super.viewWillAppear(animated) 15 16 if UserDefaults.standard.object(forKey: "HealthNumber1") != nil { 17 healthNumber1 = UserDefaults.standard.object(forKey: "HealthNumber1") as! [Double] 18 } 19 20 if UserDefaults.standard.object(forKey: "HeinetuDate") != nil { 21 heinetuDate = UserDefaults.standard.object(forKey: "HeinetuDate") as! [Double] 22 } 23 } 24 25 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 26 if segue.identifier == "goThird" { //writeViewControllerに遷移する場合 27 // SecondViewControllerをインスタンス化 28 let thirdVc = segue.destination as! healthViewController 29 // 値を渡す 30 thirdVc.numberRow = Double((sender as! IndexPath).row) 31 } 32 if segue.identifier == "goThird" { 33 34 let thirdVc = segue.destination as! healthViewController 35 36 thirdVc.heinetuRow = Double((sender as! IndexPath).row) 37 } 38 39
該当のソースコード(healthViewController)
Swift
1 2class healthViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 3 4 @IBOutlet weak var healthTableView : UITableView! 5 6 var healthNumber1 = [Double]() 7 8 var heinetuDate = [Double]() 9 10 var numberRow : Double = 0.0 11 12 var heinetuRow : Double = 0.0 13 14 var healthNum : Double = 0.0 15 16 var heinetuNum : Double = 0.0 17 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 22 23 if UserDefaults.standard.object(forKey: "HealthNumber1") != nil { 24 let numbers = UserDefaults.standard.object(forKey: "HealthNumber1") as! [Double] 25 26 healthNum = numbers[Int(Double(numberRow))] 27 28 } 29 30 if UserDefaults.standard.object(forKey: "HeinetuDate") != nil { 31 let heinetuNumber = UserDefaults.standard.object(forKey: "HeinetuDate") as! [Double] 32 33 heinetuNum = heinetuNumber[Int(Double(heinetuRow))] 34 } 35 36 if #available(iOS 13.0, *) { 37 self.overrideUserInterfaceStyle = .light 38 } else { 39 // Fallback on earlier versions 40 } 41 } 42 43 44 45 override func viewDidAppear(_ animated: Bool) { 46 super.viewDidAppear(animated) 47 } 48 49 50 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 51 return 1 52 } 53 54 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 55 56 //変数を作る 57 let cell = tableView.dequeueReusableCell(withIdentifier: "HealthTableViewCell") as! healthTableViewCell 58 //変数の中身を作る 59 if healthNum < heinetuNum + 3.9 { 60 61 cell.healthImage.image = UIImage(named: "Group36") 62 } 63 if healthNum > heinetuNum + 4.0 { 64 65 cell.healthImage.image = UIImage(named: "Group37") 66 } 67 if healthNum > heinetuNum + 9.0 { 68 69 cell.healthImage.image = UIImage(named: "Group48") 70 } 71 if healthNum > heinetuNum + 14.0 { 72 73 cell.healthImage.image = UIImage(named: "Group38") 74 } 75 76 return cell 77 } 78 79 80
試したこと
prepareforsegueで遷移を試しましたが、このコードが作動していないみたいです。
追記)ブレークポイントを使ってsimulatorで動作確認をし、作動していないと判断しました。
補足情報(FW/ツールのバージョンなど)
Xcodeバージョン12.4
> prepareforsegueで遷移を試しましたが、このコードが作動していないみたいです。
作動しないと判断した理由(エラーメッセージなど)をご質問に追記していただけますでしょうか。
また、念の為 healthViewController に相当するコードも追記していただけますでしょか。
追記しました。
thirdVc.heinetuRow = Double((sender as! IndexPath).row)
とありますが、このコードは何をおこなっているか、まずご自身で理解されていますでしょうか(このコード「だけ」で判断すると、この行で実行時エラーが起きるような気がします)。
また、
prepare(for segue: UIStoryboardSegue, sender: Any?)
が宣言されている一方、クラス内で performSegue が呼び出されていないということは、StoryBoard で Action Segue を使われているのだと思いますが、Action Segue を割り当てた部品は sender に値を渡す様な部品なのでしょうか。
ちなみに、これらのコードは何か参考にされて記述されたコードなのでしょうか。
もし、参考にされたURLや書籍名があれば、それも教えていただけないでしょうか。
過去に、講座を受けていて講師の方から習ったコードなので参考URLとかはないです。すみません。
参考URLなどがないことについては承知しました。
それ以前の私の質問(「thirdVc ... Action Segue を割り当てた部品は sender に値を渡す様な部品なのでしょうか。」までの内容)についてはいかがでしょうか。
はい。だと思います。
すみません、お返事の意図がよくつかめないのですが、
「はい。だと思います」
というのは、なにをどのように「だと思った」のでしょうか。
基本的な、いわゆる「値渡し」とよばれている方法としては間違いではないと思いますが、全体的に見た時にそれが適切な方法で使われているかわからないため、一つひとつ確認しながら聞いています。
そもそも、ご提示のコードにおける View Controller には UITableView に関するコードは一切ふくまれていないため、IndexPath で強制キャストする妥当性を判断することができません。
まず、ここでIndexPath が出てきた理由から確かめたいと思い、細かく(場合によっては追加で)確認したいと思っています。
わからない部分があれば、それはそう言っていただければ別の方法で聞きますので、まずはどこまで理解しているのか、第三者が見てもわかる様にご説明いただけませんでしょうか。
IndexPathは、遷移先の画面にTableViewがあるので、コードに含めてしまい、実際には、ここはViewController側の部品に関するコードを書かないといけませんでした。知識不足で申し訳ございません。
知識不足を謝罪する必要はありませんよ。
何がわかっていないのか正確に把握することが大切なだけですから、それを一つづつ解明していっているだけです。
さて、そうなるとプログラムの全体的な構造を見直す必要があります。
おそらく、実現されたいことは「毎日の体温を記録し、それを一覧表として出すようなアプリを作りたい」ということだと思いますが、その認識であっていますでしょうか。
そうだとして、ViewController 側には体温を入力させるようなインタフェースはありませんし、遷移先の TableView も行数が一行と固定になっていますが、これはどのような意図からそのようにされたのでしょうか。
遷移先のTableViewは、カスタムテーブルビューで、画像を表示するようにしています。ViewController側には、TableViewは置かないつもりです。この場合はprepareforsegueを利用せずに、healthViewControllerにUserDefaultsの取り出しのコードを書いた方が良いのでしょうか?
回答1件
あなたの回答
tips
プレビュー