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

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

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

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

Swift

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

Q&A

解決済

1回答

554閲覧

Double型の数値の配列データを別の画面に送る方法を教えてください。

YUSAA

総合スコア11

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/02/02 06:52

編集2021/02/02 09:08

前提・実現したいこと

健康管理アプリを開発しています。
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

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

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

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

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

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

TsukubaDepot

2021/02/02 08:53

> prepareforsegueで遷移を試しましたが、このコードが作動していないみたいです。 作動しないと判断した理由(エラーメッセージなど)をご質問に追記していただけますでしょうか。 また、念の為 healthViewController に相当するコードも追記していただけますでしょか。
YUSAA

2021/02/02 09:08

追記しました。
TsukubaDepot

2021/02/02 09:21

thirdVc.heinetuRow = Double((sender as! IndexPath).row) とありますが、このコードは何をおこなっているか、まずご自身で理解されていますでしょうか(このコード「だけ」で判断すると、この行で実行時エラーが起きるような気がします)。 また、 prepare(for segue: UIStoryboardSegue, sender: Any?) が宣言されている一方、クラス内で performSegue が呼び出されていないということは、StoryBoard で Action Segue を使われているのだと思いますが、Action Segue を割り当てた部品は sender に値を渡す様な部品なのでしょうか。 ちなみに、これらのコードは何か参考にされて記述されたコードなのでしょうか。 もし、参考にされたURLや書籍名があれば、それも教えていただけないでしょうか。
YUSAA

2021/02/02 10:10

過去に、講座を受けていて講師の方から習ったコードなので参考URLとかはないです。すみません。
TsukubaDepot

2021/02/02 10:25

参考URLなどがないことについては承知しました。 それ以前の私の質問(「thirdVc ... Action Segue を割り当てた部品は sender に値を渡す様な部品なのでしょうか。」までの内容)についてはいかがでしょうか。
YUSAA

2021/02/02 10:33 編集

はい。だと思います。
TsukubaDepot

2021/02/02 11:13

すみません、お返事の意図がよくつかめないのですが、 「はい。だと思います」 というのは、なにをどのように「だと思った」のでしょうか。 基本的な、いわゆる「値渡し」とよばれている方法としては間違いではないと思いますが、全体的に見た時にそれが適切な方法で使われているかわからないため、一つひとつ確認しながら聞いています。 そもそも、ご提示のコードにおける View Controller には UITableView に関するコードは一切ふくまれていないため、IndexPath で強制キャストする妥当性を判断することができません。 まず、ここでIndexPath が出てきた理由から確かめたいと思い、細かく(場合によっては追加で)確認したいと思っています。 わからない部分があれば、それはそう言っていただければ別の方法で聞きますので、まずはどこまで理解しているのか、第三者が見てもわかる様にご説明いただけませんでしょうか。
YUSAA

2021/02/02 11:41 編集

IndexPathは、遷移先の画面にTableViewがあるので、コードに含めてしまい、実際には、ここはViewController側の部品に関するコードを書かないといけませんでした。知識不足で申し訳ございません。
TsukubaDepot

2021/02/02 12:00

知識不足を謝罪する必要はありませんよ。 何がわかっていないのか正確に把握することが大切なだけですから、それを一つづつ解明していっているだけです。 さて、そうなるとプログラムの全体的な構造を見直す必要があります。 おそらく、実現されたいことは「毎日の体温を記録し、それを一覧表として出すようなアプリを作りたい」ということだと思いますが、その認識であっていますでしょうか。 そうだとして、ViewController 側には体温を入力させるようなインタフェースはありませんし、遷移先の TableView も行数が一行と固定になっていますが、これはどのような意図からそのようにされたのでしょうか。
YUSAA

2021/02/02 12:48

遷移先のTableViewは、カスタムテーブルビューで、画像を表示するようにしています。ViewController側には、TableViewは置かないつもりです。この場合はprepareforsegueを利用せずに、healthViewControllerにUserDefaultsの取り出しのコードを書いた方が良いのでしょうか?
guest

回答1

0

ベストアンサー

  1. 受け取り側のクラスの下にDoubleの変数をつくる。
  2. Segueする際に値を1の変数に渡す。
  3. viewWillAppearかviewDidAppearで1の変数をthirdVc.numberRowに渡す。

投稿2021/02/02 08:27

tomato879241

総合スコア133

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

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

YUSAA

2021/02/02 08:57 編集

回答ありがとうございます。 Double((sender as! IndexPath).row)の部分はこれで合ってますか?
tomato879241

2021/02/02 09:00

もしそれを他のview controllerにDoubleの変数として送りたいのであれば、答えは「はい」です。
YUSAA

2021/02/02 09:09

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問