前提・実現したいこと
健康管理アプリを作っています。
TableViewに、小数点有りのDouble型の数値(体温)を、表示したいです。
発生している問題・エラーメッセージ
配列としてUserDefaultsで保存したDouble型の数値を、Stringに変換して表示するようにしましたが
どれも0.0となっていて、保存した値が表示されません。(TableViewはカスタムTableViewを利用しています。)
該当のソースコード
Swift
1 2class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 3 4 var healthNumber1 = [Double]() 5 6 var heinetuDate = [Double]() 7 8 var todayDate = [String]() 9 10 @IBOutlet weak var dateTableView : UITableView! 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 let nib = UINib(nibName: "dateTableViewCell", bundle: nil) 16 dateTableView.register(nib, forCellReuseIdentifier: "dateTableViewCell") 17 18 // yyyy年MM月01日 12時 19 let lastDate = DateComponents(calendar: Calendar.current, day: 1, hour: 12).date! 20 21 // yyyy年MM月15日 11時 22 let now = DateComponents(calendar: Calendar.current, day: 15, hour: 11).date! 23 24 let lastDateStartOfDay = Calendar.current.startOfDay(for: lastDate) 25 let nowStartOfDay = Calendar.current.startOfDay(for: now) 26 27 let elapsedDays = Calendar.current.dateComponents([.day], from: lastDateStartOfDay, to: nowStartOfDay).day! 28 29 if elapsedDays > 14 { 30 31 todayDate.removeAll() 32 healthNumber1.removeAll() 33 34 UserDefaults.standard.set(healthNumber1, forKey: "HealthNumber1") 35 UserDefaults.standard.set(todayDate, forKey: "TodayDate") 36 } 37 38 } 39 40 override func viewDidAppear(_ animated: Bool) { 41 self.dateTableView.reloadData() 42 } 43 44 override func viewWillAppear(_ animated: Bool) { 45 super.viewWillAppear(animated) 46 47 if UserDefaults.standard.object(forKey: "HealthNumber1") != nil { 48 healthNumber1 = UserDefaults.standard.object(forKey: "HealthNumber1") as! [Double] 49 } 50 51 if UserDefaults.standard.object(forKey: "HeinetuDate") != nil { 52 heinetuDate = UserDefaults.standard.object(forKey: "HeinetuDate") as! [Double] 53 } 54 55 if UserDefaults.standard.object(forKey: "TodayDate") != nil { 56 todayDate = UserDefaults.standard.object(forKey: "TodayDate") as! [String] 57 } 58 59 } 60 61 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 62 if segue.identifier == "goThird" { 63 64 let thirdVc = segue.destination as! healthViewController 65 // 値を渡す 66 thirdVc.numberRow = Double((sender as! IndexPath).row) 67 68 } 69 70 } 71 72 73 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 74 75 return todayDate.count 76 } 77 78 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 79 80 let dateCell = tableView.dequeueReusableCell(withIdentifier: "dateTableViewCell") as! dateTableViewCell 81 82 dateCell.date2Label.text = todayDate[indexPath.row] 83 84 if UserDefaults.standard.object(forKey: "HealthNumber1") != nil { 85 let bodyNum = UserDefaults.standard.object(forKey: "HealthNumber1") as! [Double] 86 87 let strf : String = NSString(format: "%.1f", bodyNum) as String 88 89 dateCell.health2Label.text = strf 90 } 91 92 93 return dateCell 94 } 95 96 97 98}
試したこと
(format: "%.1f", bodyNum) as Stringの部分を、indexPath.rowとしてやりましたが、やり方が違うのかType 'NSString' has no member 'subscript'というエラーが出ました。
補足情報(FW/ツールのバージョンなど)
XCodeバージョン12.4
UserDefaults に Double の配列なんて保存できましたっけ?
if UserDefaults.standard.object(forKey: "HealthNumber1") != nil {
healthNumber1 = UserDefaults.standard.object(forKey: "HealthNumber1") as! [Double]
}
これでは、Doubleの配列データを呼び出せないのでしょうか?
Array(forKet:) があるから出来る気がしてきました。うろ覚えですみません。
https://developer.apple.com/documentation/foundation/userdefaults/1414792-array
いえいえ、ご指摘ありがとうございます。
回答1件
あなたの回答
tips
プレビュー