🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

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

Q&A

解決済

1回答

1299閲覧

iOS-chartsにuserdefaultsを用いたい

seiya_0930

総合スコア17

Swift

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

0グッド

0クリップ

投稿2019/09/09 08:16

編集2019/09/10 16:22

質問に答える → あなたの健康率は〇〇%ですと表示 → chartsにグラフを表示

させるアプリを作成しています。

ここで1つ困っていることがありまして、ユーザーの〇〇%の数値はy軸に反映させることができたのですが、

x軸に1回目、2回目、、、 などと表示させる所で、自分で入力していくといつか限界がきてしまうので、限りなく回数が続くようにx軸に関するコードを完成させたいです。

userDefaultsなどを使う場合、どのようにコードを入力すれば、解決するでしょうか。

userDefaults以外にも、何か解決案がありましたら、教えていただきたいです。

swift

1import UIKit 2import Charts 3 4class graphViewController: UIViewController { 5 6 var lineChartView:LineChartView! 7 var result:Int = 0 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 self.view.backgroundColor = UIColor.white 13 14 15 setupLineChartView() 16 setupData() 17 18 } 19 20 func setupLineChartView(){ 21 let lineChartView:LineChartView = LineChartView() 22 lineChartView.frame = self.view.frame 23 self.view.addSubview(lineChartView) 24 25 self.lineChartView = lineChartView 26 27 } 28 29 func setupData() { 30 31 var lineChartEntry = [ChartDataEntry]() 32 for i in 1...20 { 33 let chartData = ChartDataEntry(x:Double(i),y:Double(result)) 34 lineChartEntry.append(chartData) 35 36 } 37 let gradientColors = [UIColor.blue.cgColor,UIColor.clear.cgColor] as CFArray 38 let colorLocations:[CGFloat] = [1.0,0.0] 39 let gradient = CGGradient.init(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: gradientColors, locations: colorLocations) 40 41 let line = LineChartDataSet(entries:lineChartEntry, label: "score") 42 line.colors = [NSUIColor.black] 43 line.fill = Fill.fillWithLinearGradient(gradient!, angle: 90.0) 44 line.drawFilledEnabled = true 45 line.mode = .horizontalBezier 46 47 let data = LineChartData() 48 data.addDataSet(line) 49 50 lineChartView.data = data 51 lineChartView.chartDescription?.text = "ヘルスケアアプリ" 52 } 53 54}

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

説明説明]

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

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

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

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

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

guest

回答1

0

ベストアンサー

アプリの状況がわかないですが、何個かのデータを順番に保存して、取り出したいなら
利用するものはArrayになるのではないかと思います。

Swift

1// メンバ変数に宣言が必要 2var scores: [Double] = [] 3let ud = UserDefaults.standard 4 5// 初期化(viewDidLoadなどで) 6if let data = ud.value(forKey: "data") { 7 self.scores = data 8} else { 9 var score : [Double] = [] 10 ud.set(score, forKey: "data") 11} 12 13// 保存箇所 14// イメージしやすいように(仮)データ 15// (例) scores = [34.5, 20.8, 80.5] 16scores.append(33.5) // ここで保存する 17ud.set(score, forKey: "data") // [34.5, 20.8, 80.5, 33.5]になります。 18 19 20// 読み出し箇所 21self.scores = ud.value(forKey: "data") as! [Double]

などのようにして、それを利用してコードを書けばいいと思います。
ちなみに、「1回目」、「2回目」などは

Swift

1var xLabel: [String] = [] 2for n in 1 ... scores.count { 3 xLabel.append("n回目") 4}

などで、配列を作って軸に利用したらいいと思います。

投稿2019/09/10 15:48

hameji

総合スコア1380

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

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

seiya_0930

2019/09/10 16:20

説明がまだまだ下手くそですみません。。。 ユーザーが質問に答え→スコアを保存→正答率をグラフに表示(x、1回目 y、60% x、2回目 y、40%) 問題点:答える度にデータが保存されないため、上記のようなグラフになってしまう
seiya_0930

2019/09/10 16:22

graphViewControllerのコードを大幅に変更しましたので変更しておきます。
hameji

2019/09/10 18:18

何を言っているのか全くさっぱりです。 どんな画面推移をするかがイメージできないので、答えようがないです。 (1つの質問表示・回答 -> 次の質問? or その時点でグラフ表示?) そもそもコード全部を全修正してもらえると思わないでください。 解決となるポイントを教える程度です。 ちなみに、個々の質問でのscoreの加算は Double(Intでいいのかな?)のArrayでなく、 ただのIntとして保存すればいいのではないでしょうか? ボタンを選ぶ毎に UserDefaults で 読み出し -> 加算 -> 保存 とすればいいのではないでしょうか?
seiya_0930

2019/09/11 03:57

すみません全修正してもらう気持ちはありません、そう思わせてしまったら申し訳なく思います。 コードの方をご提示いただきありがとうございます。初めて作るアプリなのでなかなかイメージが湧きませんでしたがかなり理解することができました。 自分はresultViewControllerの変数resultの中身を、graphViewControllerの変数resultに受け渡す形となっているのですが、userDefaultsを設定するのはどちらのviewContollerで行えば良いですか?
hameji

2019/09/11 23:11 編集

userDefaultsを利用するのであれば、変数resultをgraphViewControllerに渡す必要は無くなります。好きな時に保存して、好きな時に呼び出すことができますので。 それぞれのViewでUserdefaultsをメンバ変数で宣言。 保存する時は保存のコードを。 読み出したい時に読み出しのコードを書けば、view関係なく使えますよ。 なので、質問のview(読み出し(累計点にするため)と保存コード)とグラフのview(読み出し)どちらにも記述が必要となります。
seiya_0930

2019/09/12 09:04

ありがとうございます!! なんとか理解することができました。 教えてもらったことを生かしてまた頑張りたいと思います。 本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問