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

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

ただいまの
回答率

87.34%

iOS-chartsにuserdefaultsを用いたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 545

score 9

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

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

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

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

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

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

import UIKit
import Charts

class graphViewController: UIViewController {

    var lineChartView:LineChartView!
    var result:Int = 0

    override func viewDidLoad() {
            super.viewDidLoad()

        self.view.backgroundColor = UIColor.white


        setupLineChartView()
        setupData()

    }

    func setupLineChartView(){
        let lineChartView:LineChartView = LineChartView()
        lineChartView.frame = self.view.frame
        self.view.addSubview(lineChartView)

        self.lineChartView = lineChartView

    }

    func setupData() {

        var lineChartEntry = [ChartDataEntry]()
        for i in 1...20 {
            let chartData = ChartDataEntry(x:Double(i),y:Double(result))
            lineChartEntry.append(chartData)

        }
        let gradientColors = [UIColor.blue.cgColor,UIColor.clear.cgColor] as CFArray
        let colorLocations:[CGFloat] = [1.0,0.0]
        let gradient = CGGradient.init(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: gradientColors, locations: colorLocations)

        let line = LineChartDataSet(entries:lineChartEntry, label: "score")
        line.colors = [NSUIColor.black]
        line.fill = Fill.fillWithLinearGradient(gradient!, angle: 90.0)
        line.drawFilledEnabled = true
        line.mode = .horizontalBezier

        let data = LineChartData()
        data.addDataSet(line)

        lineChartView.data = data
        lineChartView.chartDescription?.text = "ヘルスケアアプリ"
    }

}
import UIKit


// クイズ1つの問題がどんな値を扱うかうか
//情報が更新されることはないので、構造体にする
struct  Quiz {

    let text: String
    let optionOne: String
    let optionTwo: String

    let optionThree: String

    // Initializer(イニシャライザ) = 初期化処理
    init(text: String, optionOne: String, optionTwo: String, optionThree: String) {
        self.text = text
        self.optionOne = optionOne
        self.optionTwo = optionTwo
        self.optionThree = optionThree

    }


}
import UIKit

class nextViewController: UIViewController {

    // MARK: - IBOutlet

    @IBOutlet var quizNumberLabel: UILabel!
    @IBOutlet var quizTextView: UITextView!
    @IBOutlet var optionOneButton: UIButton!
    @IBOutlet var optionTwoButton: UIButton!
    @IBOutlet var optionThreeButton: UIButton!

    // MARK: - Properties

    var point: Int = 0
    var quizNumber: Int = 0
    var quizArray: [Quiz] = []

    // MARK: - Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()

        optionOneButton.center = self.optionOneButton.center
        optionOneButton.setTitleColor(.white, for: UIControl.State.normal)
        optionOneButton.layer.borderWidth = 2
        optionOneButton.layer.borderColor = UIColor.black.cgColor
        optionOneButton.layer.cornerRadius = 10

        optionTwoButton.center = self.optionTwoButton.center
        optionTwoButton.layer.borderWidth = 2
        optionTwoButton.layer.borderColor = UIColor.black.cgColor
        optionTwoButton.layer.cornerRadius = 10

        optionThreeButton.center = self.optionThreeButton.center
        optionThreeButton.layer.borderWidth = 2
        optionThreeButton.layer.borderColor = UIColor.black.cgColor
        optionThreeButton.layer.cornerRadius = 10



        setUpQuiz()
        showQuiz()
    }

    // MARK: - UI

    func setUpQuiz() {

        let quiz1 = Quiz(text: "毎日3食食べましたか?", optionOne:"はい", optionTwo:"時々食べた", optionThree: "食べていない")
        let quiz2 = Quiz(text: "決まった時間にご飯を食べていますか?", optionOne: "食べている", optionTwo: "時々食べる", optionThree: "食べていない")
        let quiz3 = Quiz(text: "果物を1日1回は食べていますか?", optionOne: "はい", optionTwo: "時々食べる", optionThree: "食べていない")
        let quiz4 = Quiz(text: "野菜を十分に食べていますか?", optionOne: "食べている", optionTwo: "日による", optionThree: "食べていない")
        let quiz5 = Quiz(text: "インスタンス食品は食べましたか?", optionOne: "食べていない", optionTwo: "時々食べた", optionThree: "よく食べた")
        let quiz6 = Quiz(text: "タバコを吸いましたか?", optionOne: "吸わない", optionTwo: "たまに吸う", optionThree: "たくさん吸う")
        let quiz7 = Quiz(text: "お酒を飲みましたか?", optionOne: "飲まない", optionTwo: "たまに飲んだ", optionThree: "飲まない")
        let quiz8 = Quiz(text: "運動して体を動かしましたか?", optionOne: "動かした", optionTwo: "たまに動かした", optionThree: "動かしていない")
        let quiz9 = Quiz(text: "翌日まで疲れが残ることがありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある")
        let quiz10 = Quiz(text: "食欲がない時がありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある")
        let quiz11 = Quiz(text: "原因不明の下痢などが起こりますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある")
        let quiz12 = Quiz(text: "朝スッキリ起きられない時がありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある")
        let quiz13 = Quiz(text: "中々寝付けないことがありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある")
        let quiz14 = Quiz(text: "何事にもやる気が起きにくいですか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある")
        let quiz15 = Quiz(text:"色々なことに関心が薄くなりますか?", optionOne: "特にない", optionTwo: "時々ある",optionThree: "よくある")
        let quiz16 = Quiz(text: "体調を崩しやすいですか?", optionOne: "特にない", optionTwo: "時期による", optionThree: "よく崩す")
        let quiz17 = Quiz(text: "未来について妙に焦ることがありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある")
        let quiz18 = Quiz(text: "些細なことで腹が立つことがありますか?", optionOne: "特にない", optionTwo: "時々ある", optionThree: "よくある")
        let quiz19 = Quiz(text: "肌荒れの症状が出ることがありますか?", optionOne: "特にない", optionTwo: "少し荒れる", optionThree: "よく荒れる")
        let quiz20 = Quiz(text: "睡眠は十分に取れていますか?", optionOne: "取れている", optionTwo: "日による", optionThree: "取れていない")

        quizArray.append(quiz1)
        quizArray.append(quiz2)
        quizArray.append(quiz3)
        quizArray.append(quiz4)
        quizArray.append(quiz5)
        quizArray.append(quiz6)
        quizArray.append(quiz7)
        quizArray.append(quiz8)
        quizArray.append(quiz9)
        quizArray.append(quiz10)
        quizArray.append(quiz11)
        quizArray.append(quiz12)
        quizArray.append(quiz13)
        quizArray.append(quiz14)
        quizArray.append(quiz15)
        quizArray.append(quiz16)
        quizArray.append(quiz17)
        quizArray.append(quiz18)
        quizArray.append(quiz19)
        quizArray.append(quiz20)

    }

    func showQuiz() {
        //クイズ番号、クイズ、各選択肢の表示
        quizNumberLabel.text = String(quizNumber + 1) + "問目"
        quizTextView.text = quizArray[quizNumber].text

        UIView.setAnimationsEnabled(false)
        optionOneButton.setTitle(quizArray[quizNumber].optionOne , for:.normal )
        optionOneButton.layoutIfNeeded()
        optionTwoButton.setTitle(quizArray[quizNumber].optionTwo, for: .normal)
        optionTwoButton.layoutIfNeeded()
        optionThreeButton.setTitle(quizArray[quizNumber].optionThree, for: .normal)
        optionThreeButton.layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }

    func resetQuiz() {
        point = 0
        quizNumber = 0
        showQuiz()
    }


    func updataQuiz() {
        if quizNumber >= 19 {
            // 全て完了時の処理 画面遷移するみたいなのでここは消してください
            performSegue(withIdentifier: "toSecond", sender: nil)
            //self.performSegue(withIdentifier: "toSecond", sender: nil)
        } else {
            quizNumber = quizNumber + 1
            showQuiz()
        }
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toSecond" {
            let resultVC = segue.destination as! resultViewController
            resultVC.result = point

        }
    }
    // MARK: - IBAction

    @IBAction func pushOptionOneButton() {
        // Option1 のボタンを押したのでPointに5%加算
        point += 5
        updataQuiz()

    }

    @IBAction func pushOptionTwoButton() {
        // Option2 のボタンを押したのでPointに3%加算
        point += 3
        updataQuiz()
    }

    @IBAction func pushOptionThreeButton() {
        // Option3 のボタンを押したのでPointに1%加算
        point += 1
        updataQuiz()
    }

}

説明説明]

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

// メンバ変数に宣言が必要
var scores: [Double] = []
let ud = UserDefaults.standard

// 初期化(viewDidLoadなどで)
if let data = ud.value(forKey: "data") {
  self.scores = data
} else {
  var score : [Double] = []
  ud.set(score, forKey: "data")
}

// 保存箇所
// イメージしやすいように(仮)データ
// (例) scores = [34.5, 20.8, 80.5] 
scores.append(33.5) // ここで保存する
ud.set(score, forKey: "data") // [34.5, 20.8, 80.5, 33.5]になります。


// 読み出し箇所
self.scores = ud.value(forKey: "data") as! [Double]

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/11 12:57

    すみません全修正してもらう気持ちはありません、そう思わせてしまったら申し訳なく思います。

    コードの方をご提示いただきありがとうございます。初めて作るアプリなのでなかなかイメージが湧きませんでしたがかなり理解することができました。

    自分はresultViewControllerの変数resultの中身を、graphViewControllerの変数resultに受け渡す形となっているのですが、userDefaultsを設定するのはどちらのviewContollerで行えば良いですか?

    キャンセル

  • 2019/09/12 08:10 編集

    userDefaultsを利用するのであれば、変数resultをgraphViewControllerに渡す必要は無くなります。好きな時に保存して、好きな時に呼び出すことができますので。

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

    キャンセル

  • 2019/09/12 18:04

    ありがとうございます!!
    なんとか理解することができました。

    教えてもらったことを生かしてまた頑張りたいと思います。
    本当にありがとうございます!!

    キャンセル

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る