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

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

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

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

Q&A

解決済

1回答

587閲覧

ios-chartsで作成したグラフに、ユーザーが入力したデータを反映させたい

seiya_0930

総合スコア17

Swift

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

0グッド

0クリップ

投稿2019/09/04 09:30

編集2019/09/06 05:57

イメージ説明![イメーイメージ説明7d47904db71cc064555909ab0a47816.png)
イメージ説明
イメージ説明
イメージ説明

ヘルスケアアプリを作成しています。

そこで、ユーザーが質問に答えたデータをもとにそのデータをグラフに反映させたいと考えています。
そのためぬは変数をもとにグラフにくっつけるような考えかな?となんとなく思っています。
何か良い考えなどがありましたらぜひご提示お願いいたします。

swift

1import UIKit 2 3 4// クイズ1つの問題がどんな値を扱うかうか 5//情報が更新されることはないので、構造体にする 6struct Quiz { 7 8 let text: String 9 let optionOne: String 10 let optionTwo: String 11 12 let optionThree: String 13 14 // Initializer(イニシャライザ) = 初期化処理 15 init(text: String, optionOne: String, optionTwo: String, optionThree: String) { 16 self.text = text 17 self.optionOne = optionOne 18 self.optionTwo = optionTwo 19 self.optionThree = optionThree 20 21 } 22 23 24}

swift

1import UIKit 2 3class resultViewController: UIViewController { 4 5 @IBOutlet var label:UILabel! 6 7 //ここにpointを渡す 8 var result :String = "" 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 label.text = String(result) 14 15 16 // Do any additional setup after loading the view. 17 } 18 19 override func didReceiveMemoryWarning() { 20 super.didReceiveMemoryWarning() 21 // Dispose of any resources that can be recreated. 22 } 23 24 25 26 27}

swift

1import UIKit 2 3class nextViewController: UIViewController { 4 5 // MARK: - IBOutlet 6 7 @IBOutlet var quizNumberLabel: UILabel! 8 @IBOutlet var quizTextView: UITextView! 9 @IBOutlet var optionOneButton: UIButton! 10 @IBOutlet var optionTwoButton: UIButton! 11 @IBOutlet var optionThreeButton: UIButton! 12 13 // MARK: - Properties 14 15 var point: Int = 0 16 var quizNumber: Int = 0 17 var quizArray: [Quiz] = [] 18 19 // MARK: - Lifecycle 20 21 override func viewDidLoad() { 22 super.viewDidLoad() 23 24 setUpQuiz() 25 showQuiz() 26 } 27 28 // MARK: - UI 29 30 func setUpQuiz() { 31 32 let quiz1 = Quiz(text: "毎日3食食べましたか?", optionOne:"はい", optionTwo:"時々食べた", optionThree: "食べていない") 33 let quiz2 = Quiz(text: "決まった時間にご飯を食べていますか?", optionOne: "食べている", optionTwo: "時々食べる", optionThree: "食べていない") 34 let quiz3 = Quiz(text: "果物を1日1回は食べていますか?", optionOne: "はい", optionTwo: "時々食べる", optionThree: "食べていない") 35 let quiz4 = Quiz(text: "野菜を十分に食べていますか?", optionOne: "食べている", optionTwo: "日による", optionThree: "食べていない") 36 let quiz5 = Quiz(text: "インスタンス食品は食べましたか?", optionOne: "食べていない", optionTwo: "時々食べた", optionThree: "よく食べた") 37 let quiz6 = Quiz(text: "タバコを吸いましたか?", optionOne: "吸わない", optionTwo: "たまに吸う", optionThree: "たくさん吸う") 38 let quiz7 = Quiz(text: "お酒を飲みましたか?", optionOne: "飲まない", optionTwo: "たまに飲んだ", optionThree: "飲まない") 39 let quiz8 = Quiz(text: "運動して体を動かしましたか?", optionOne: "動かした", optionTwo: "たまに動かした", optionThree: "動かしていない") 40 let quiz9 = Quiz(text: "翌日まで疲れが残ることがありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある") 41 let quiz10 = Quiz(text: "食欲がない時がありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある") 42 let quiz11 = Quiz(text: "原因不明の下痢などが起こりますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある") 43 let quiz12 = Quiz(text: "朝スッキリ起きられない時がありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある") 44 let quiz13 = Quiz(text: "中々寝付けないことがありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある") 45 let quiz14 = Quiz(text: "何事にもやる気が起きにくいですか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある") 46 let quiz15 = Quiz(text:"色々なことに関心が薄くなりますか?", optionOne: "特にない", optionTwo: "時々ある",optionThree: "よくある") 47 let quiz16 = Quiz(text: "体調を崩しやすいですか?", optionOne: "特にない", optionTwo: "時期による", optionThree: "よく崩す") 48 let quiz17 = Quiz(text: "未来について妙に焦ることがありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある") 49 let quiz18 = Quiz(text: "些細なことで腹が立つことがありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある") 50 let quiz19 = Quiz(text: "肌荒れの症状が出ることがありますか?", optionOne: "特にない", optionTwo: "少し荒れる", optionThree: "よく荒れる") 51 let quiz20 = Quiz(text: "睡眠は十分に取れていますか?", optionOne: "取れている", optionTwo: "日による", optionThree: "取れていない") 52 53 quizArray.append(quiz1) 54 quizArray.append(quiz2) 55 quizArray.append(quiz3) 56 quizArray.append(quiz4) 57 quizArray.append(quiz5) 58 quizArray.append(quiz6) 59 quizArray.append(quiz7) 60 quizArray.append(quiz8) 61 quizArray.append(quiz9) 62 quizArray.append(quiz10) 63 quizArray.append(quiz11) 64 quizArray.append(quiz12) 65 quizArray.append(quiz13) 66 quizArray.append(quiz14) 67 quizArray.append(quiz15) 68 quizArray.append(quiz16) 69 quizArray.append(quiz17) 70 quizArray.append(quiz18) 71 quizArray.append(quiz19) 72 quizArray.append(quiz20) 73 74 } 75 76 func showQuiz() { 77 //クイズ番号、クイズ、各選択肢の表示 78 quizNumberLabel.text = String(quizNumber + 1) + "問目" 79 quizTextView.text = quizArray[quizNumber].text 80 81 UIView.setAnimationsEnabled(false) 82 optionOneButton.setTitle(quizArray[quizNumber].optionOne , for:.normal ) 83 optionOneButton.layoutIfNeeded() 84 optionTwoButton.setTitle(quizArray[quizNumber].optionTwo, for: .normal) 85 optionTwoButton.layoutIfNeeded() 86 optionThreeButton.setTitle(quizArray[quizNumber].optionThree, for: .normal) 87 optionThreeButton.layoutIfNeeded() 88 UIView.setAnimationsEnabled(true) 89 } 90 91 func resetQuiz() { 92 point = 0 93 quizNumber = 0 94 showQuiz() 95 } 96 97 98 func updataQuiz() { 99 if quizNumber >= 19 { 100 // 全て完了時の処理 画面遷移するみたいなのでここは消してください 101 performSegue(withIdentifier: "toSecond", sender: nil) 102 //self.performSegue(withIdentifier: "toSecond", sender: nil) 103 } else { 104 quizNumber = quizNumber + 1 105 showQuiz() 106 } 107 } 108 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 109 if segue.identifier == "toSecond" { 110 let resultVC = segue.destination as! resultViewController 111 resultVC.result = "あなたの健康率は(point)%です" 112 } 113 } 114 // MARK: - IBAction 115 116 @IBAction func pushOptionOneButton() { 117 // Option1 のボタンを押したのでPointに5%加算 118 point += 5 119 updataQuiz() 120 121 } 122 123 @IBAction func pushOptionTwoButton() { 124 // Option2 のボタンを押したのでPointに3%加算 125 point += 3 126 updataQuiz() 127 } 128 129 @IBAction func pushOptionThreeButton() { 130 // Option3 のボタンを押したのでPointに1%加算 131 point += 1 132 updataQuiz() 133 } 134 135}

swift

1 2import UIKit 3import Charts 4 5class graphViewController: UIViewController { 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 var rect = view.bounds 10 rect.origin.y += 20 11 rect.size.height -= 20 12 let barChartView = BarChartView(frame: rect) 13 let entry = [ 14 BarChartDataEntry(x: 10, y: 30), 15 BarChartDataEntry(x: 20, y: 20), 16 BarChartDataEntry(x: 30, y: 40), 17 BarChartDataEntry(x: 40, y: 10), 18 BarChartDataEntry(x: 50, y: 30) 19 ] 20 let set = [ 21 BarChartDataSet(entries: entry, label: "Data") 22 ] 23 barChartView.data = BarChartData(dataSets: set) 24 view.addSubview(barChartView) 25 } 26}

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

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

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

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

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

hayabusabusash

2019/09/05 12:15

どんなグラフを想定していますか? 質問に答えたデータというのは選択肢ごとのデータでしょうか?
seiya_0930

2019/09/05 17:17

折れ線グラフや棒グラフを想定しています。 1〜20問までA B C 3つの質問に答えてもらい、それぞれ5%、3%、1%の数字を代入し、答え切ったら健康率は〇〇%です!というものを想定しています。 その〇〇%という数字をグラフに反映させたいと考えています。 丸投げの質問になってしまっているようで申し訳ありません。。
hayabusabusash

2019/09/05 23:29 編集

であれば結果を表示するViewControllerにその%を渡し、 Chartsでその%を表示するようにすればいいと思います。 ただ、現状ではデータの保存などは行っていないようなので 1人分のデータしか取ることができないと思います。 自分の端末のこのアプリをインストールしておき、 そこで答えた人全員のデータを表示させたい場合はローカルにデータを保存するだけで実現することができると思いますが、 アプリをストアなどで配布し、個人の端末で使ってもらう場合はサーバーなどにデータをアップロードする必要があると思います。
seiya_0930

2019/09/06 04:07

結果を表示するviewcontrollerに%表示は先ほど完了したのですが、あとは chartsに%を表示させる方法で悩んでいます。 今の所は時間の都合もあるのでローカルにデータを保存するところを考えています。
hayabusabusash

2019/09/06 04:31

ローカルに保存するとなるとデータベースが必要なので、 一番手っ取り早いのはUserDefaultsで簡易的に保存する方法ですね。 時間があるということならRealmを使ってもいいと思います。 そこで保存したデータを結果を表示するViewControllerで読み込んで、 Chartsに表示させるだけなのでそこまで時間はかからないと思います。 あとこの質問で得たい回答は何でしょうか? どういう部分が分からないのかを教えていただけるともう少し具体的に回答できると思います。
seiya_0930

2019/09/06 04:44

すみません。 chartsのグラフに結果の%を反映させる方法を教えていただきたいです。
hayabusabusash

2019/09/06 04:57

わかりました。 とりあえず現状どこまでできているのか教えていただけますか? Chartsの使い方はある程度わかっていて、グラフの表示はだけはできている感じですか? ただ、自分はChartsは使ったことがないのであまり詳しいアドバイスはできないかもしれません...
seiya_0930

2019/09/06 05:25

かしこまりました。 はい、グラフの表示はできる状態です。 自分は、resultviewcontrollerの健康率は〇〇%です!の〇〇にpoint変数を代入しているので、グラフのy座標にpointを代入すればいけると思って試したのですが、エラーが起きてしまったのですが、方向性はこんな感じで考えています。
hayabusabusash

2019/09/06 05:47

なるほど、なら本当にあと少しですね。 できればそのグラフを表示している部分とエラーが出たコードが見たいので、 質問に追記していただけませんか?
seiya_0930

2019/09/06 05:57

そうなんですよね。。。 追記致しました。 よろしくお願いい致します。
hayabusabusash

2019/09/06 06:41

追記ありがとうございます。 エラーが出たのはgraphViewControllerですか? 軽く見た感じ問題なさそうですが、どんなエラーになりますか?
seiya_0930

2019/09/06 14:44

はい、graphviewcpntrollerです。 y座標にpointを入れたら、 Use of unresolved identifier 'point'; did you mean 'print'? というエラーが出ました。
hayabusabusash

2019/09/06 15:04

printにスペルミスしてますよ。pointじゃないですか? そもそもgraphViewControllerにはpointという変数はないんじゃないでしょうか?
seiya_0930

2019/09/06 15:39

pointという変数自体ありませんが、point変数を共有したいため変数に代入したりしているのですが、なかなかうまくいかない状態です。 異なるviewcontroller同士で変数を共有できる方法を調べて試しているのですがうまくいかないので、何か方法がありましたら意見をいただきたいです。
hayabusabusash

2019/09/06 15:57 編集

resultViewControllerのpointをgraphViewControllerに渡す感じですか? nextViewControllerのpointをgraphViewControllerに渡すのではダメなのでしょうか? できればどのように画面遷移をするのか教えていただけないでしょうか?
seiya_0930

2019/09/06 16:09

すいません返答が悪かったです。 nextViewControllerのpointをgraphViewControllerに渡したいと思っています。
seiya_0930

2019/09/06 16:12

最後のresultViewControllerに ”グラフを見て確認する”ボタンを設置してそのボタンを押したらgraphVireControllerに遷移させたいと考えています。
hayabusabusash

2019/09/06 16:22

なるほど ということは遷移的には nextViewController -> resultViewController -> graphViewController という順番の遷移になりますか?
seiya_0930

2019/09/06 16:24

現在はそう考えています!
hayabusabusash

2019/09/06 16:27

ありがとうございます。理解しました。 あと確認なんですが、resultViewControllerやgraphViewControllerはMain.storyboardに全て入っている感じですか?
seiya_0930

2019/09/06 16:30

説明がいつも下手ですみません。 はい。もう全てMain.storyboardに配置してあります。
guest

回答1

0

ベストアンサー

最後のresultViewControllerに ”グラフを見て確認する”ボタンを設置してそのボタンを押したらgraphVireControllerに遷移させたいと考えています。

ということなので、
まずはnextViewControllerからresultViewControllerにpointを渡します。

swift

1class nextViewController: UIViewController { 2 3 // 省略します 4 5 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 6 if segue.identifier == "toSecond" { 7 let resultVC = segue.destination as! resultViewController 8 // Intに変更したのでそのまま渡す 9 resultVC.result = point 10 } 11 } 12}

swift

1class resultViewController: UIViewController { 2 3 @IBOutlet var label:UILabel! 4 5 //ここにpointを渡す 6 var result: Int = 0 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 label.text = "あなたの健康率は(result)%です" 12 } 13}

resultViewControllerのresultIntに変更した方がスムーズだと思うので、
Intに変更しました。

次にresultViewControllerからgraphViewControllerにresultを渡します。

swift

1class resultViewController: UIViewController { 2 3 // 省略します 4 5 // 新しくボタンなどをAction接続してください 6 @IBAction func onTapButton(_ sender: Any) { 7 // graphViewControllerに遷移 8 performSegue(withIdentifier: /*設定したSegueのidentifierを入れてください*/, sender: nil) 9 } 10 11 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 12 if segue.identifier == /*設定したSegueのidentifierを入れてください*/ { 13 let graphVC = segue.destination as! graphViewController 14 graphVC.result = result 15 } 16 } 17}

swift

1class graphViewController: UIViewController { 2 3 // ここにresultを渡す 4 var result: Int = 0 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 var rect = view.bounds 10 rect.origin.y += 20 11 rect.size.height -= 20 12 let barChartView = BarChartView(frame: rect) 13 let entry = [ 14 BarChartDataEntry(x: 1, y: Double(result)) // resultをグラフに表示 15 ] 16 let set = [ 17 BarChartDataSet(entries: entry, label: "Data") 18 ] 19 barChartView.data = BarChartData(dataSets: set) 20 view.addSubview(barChartView) 21 } 22}

長々と書きましたが、
ViewController間でどんどん値を渡していくよりはUserDefaultsなどを使って
ローカルに保存したものを読み込んだほうが楽だと思うのでそちらをお勧めします。

UserDefaultsは配列も保存できるので複数人の結果を保存することもできると思います。

投稿2019/09/06 16:50

hayabusabusash

総合スコア767

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

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

seiya_0930

2019/09/06 17:14

無事値を渡すことができました。。。。。 本当に何度も助けていただいて本当に感謝しても仕切れません。 もっと勉強したいと思います。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問