ボタンを押したら記録とその時刻をtableViewに保存したいのですが、表示する時刻と回数が配列に入っている一つまえのものになってしまいます。
前の画面から値を受け取っているのですがそこの配列に入っている回数と時刻はprint(.description)で確認したところ正しかったので、問題はこのtableViewにあると思われます。(tableViewでuserdefaultから受け取った配列に新しい回数と時刻が入っていない)
何かアドバイスでも頂けたら幸いです。
追記1/13日 回答お待ちしています。
Swift
1var resultArray2 = [String]() 2 3 var dateArray2 = [String]() 4 5 var date2 = Date() 6 7 var Array2: [[String]] = [] 8... 9... 10... 11 12 13override func viewDidLoad() { 14 super.viewDidLoad() 15 16 17 tableView.delegate = self 18 tableView.dataSource = self 19 20 if UserDefaults.standard.object(forKey: "save") != nil { 21 22 Array2 = UserDefaults.standard.object(forKey: "save") as! [[String]] 23 } 24 25 26 self.resultArray2 = self.Array2[0] 27 self.dateArray2 = self.Array2[1] 28 29 Array2 = [resultArray2, dateArray2] 30 31 print("Array2:", Array2.description) 32 print(resultArray2.description) 33 print(dateArray2.description) 34 35 } 36 37 38 override func viewWillAppear(_ animated: Bool) { 39 super.viewDidAppear(animated) 40 41 tableView.reloadData() 42 } 43 44 45 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 46 47 return resultArray2.count 48 } 49 50 func numberOfSections(in tableView: UITableView) -> Int { 51 return 1 52 } 53 54 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 55 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 56 57 58 /*print("Array2:at cellForRowAt", Array2.description) 59 print(Array2.count) 60 print(resultArray2.description) 61 print(dateArray2.description)*/ 62 63 cell.textLabel!.text = resultArray2[indexPath.row] 64 cell.detailTextLabel!.text = dateArray2[indexPath.row] 65 66 return cell 67 } 68 69 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 70 return 40 71 } 72 73 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 74 75 if editingStyle == .delete { 76 resultArray2.remove(at: indexPath.row) 77 dateArray2.remove(at: indexPath.row) 78 79 Array2 = [resultArray2, dateArray2] 80 81 UserDefaults.standard.set(Array2, forKey: "save") 82 83 tableView.reloadData() 84 85 } 86 } 87 88
前の画面
Swift
1var resultArray1 = [String]() 2 3 var dateArray1 = [String]() 4 5 var Array1: [[String]] = [] 6 7 var date1 = Date() 8 9 10... 11... 12 @IBAction func save(_ sender: Any) { 13 14 //配列を取り出す 15 if (UserDefaults.standard.object(forKey: "save") != nil) { 16 Array1 = UserDefaults.standard.object(forKey: "save") as! [[String]] 17 18 } 19 20 //Array1の要素0(resultArray1の保存したもの)をresultArray1に入れる 21 self.resultArray1 = self.Array1[0] 22 // Array1の要素1(dateArray1の保存したもの)をdateArray1に入れる 23 self.dateArray1 = self.Array1[1] 24 25 26 //zikanを呼び出す 27 zikan() 28 //resultArrayに回数を追加 29 resultArray1.append(countLabel2.text!) 30 31 Array1 = [resultArray1, dateArray1] 32 33 UserDefaults.standard.set(Array1, forKey: "save") 34 35 print("Array1:", resultArray1.count) 36 37 38 } 39 40 41 func zikan() { 42 //日付のフォーマットを指定する 43 let format = DateFormatter() 44 format.dateFormat = DateFormatter.dateFormat(fromTemplate: "yMdkHm", options: 0, locale: Locale(identifier: "ja_JP")) 45 46 //日付をStringに変換する 47 let sDate = format.string(from: date1) 48 //日付をdateArrayに入れる 49 dateArray1.append(sDate) 50 } 51
「数分前」ではなく具体的に書いて下さい。
前半の質問と後半の質問は関連があるのでしょうか?無いのであれば質問を分けて下さい。
>>前の画面から値を受け取っているのですがそこの配列に入っている回数と時刻は正しかった
「正しかった」の検証方法と、なぜ正しいと判断したのかを書いて下さい。
>>配列に入っている一つまえのものになってしまいます
一回目はどうなるのでしょうか?
1回目の時は正しい時刻と回数でした。2回目からずれるようになりました。そこで配列を削除して確かめようとしたところ、配列を削除できませんでした。
1回目 → 1回目のデータが表示される(正しい)
2回目 → 1回目のデータが表示される(2回目のデータが表示されない)
3回目 → 1回目、2回目のデータが表示される(3回目のデータが表示されない)
ということでしょうか?
そうです。
>>print(.description)で確認したところ正しかったので
というのは、質問のコードのviewDidLoadでprintした結果が正しいということですよね?
前の画面はUserDefaultsで保存した後にprint()しました。
tableViewでも同じようにuserDefaultで取り出した後に確認しました。
「userDefaultで取り出した後」というのはviewDidLoadのことですか?(違う言葉で返さないで下さい)
そうです
tableView(_:cellForRowAt:)の最初に、
print(indexPath.row, resultArray2[indexPath.row], dateArray2[indexPath.row])
を追加して、3回目のときの出力を教えて下さい。
本題と外れ(?)。。。と完全には言えないですが、
「配列を削除できませんでした」周辺の間違いが2つありました。
editingStyle == .deleteのとこ、
間違いがありますので、print用い、コード見直してくださいね。
あと、viewdidloadはreloadDataでは読み込まれませんよ。
0 1 2019/1/11 10:14
1 1 2019/1/11 10:16
2 2 2019/1/11 10:16
3 2 2019/1/11 10:17
4 3 2019/1/11 10:17
5 3 2019/1/11 10:18
6 1 2019/1/11 10:19
7 1 2019/1/11 10:25
8 1 2019/1/11 10:27
9 1 2019/1/11 10:33
10 1 2019/1/11 10:36
11 1 2019/1/11 10:55
12 2 2019/1/11 10:57
13 3 2019/1/11 11:33
です。やはり現在のデータは配列に入っていません。
間違いがあれば教えていただきたいのですがダメでしょうか。
コードを見直してもどうすれば良いか分からないの繰り返しです。
調べても出てこないこなく困っているので投稿しています。
viewdidloadはreloadDataでは読み込まれませんよ。とはどのような意味でしょうか。
ViewwillAppearにreloadDataがあるのですが。
このときの、viewDidLoadでの print("Array2:", Array2.description) の出力を教えて下さい。
Array2: [["1", "1", "2", "2", "3", "3", "1", "1", "1", "1", "1", "1", "2", "3"], ["2019/1/11 10:14", "2019/1/11 10:16", "2019/1/11 10:16", "2019/1/11 10:17", "2019/1/11 10:17", "2019/1/11 10:18", "2019/1/11 10:19", "2019/1/11 10:25", "2019/1/11 10:27", "2019/1/11 10:33", "2019/1/11 10:36", "2019/1/11 10:55", "2019/1/11 10:57", "2019/1/11 11:33"]]
です
前の画面で保存した配列は
Array1: [["1", "1", "2", "2", "3", "3", "1", "1", "1", "1", "1", "1", "2", "3", "1"], ["2019/1/11 10:14", "2019/1/11 10:16", "2019/1/11 10:16", "2019/1/11 10:17", "2019/1/11 10:17", "2019/1/11 10:18", "2019/1/11 10:19", "2019/1/11 10:25", "2019/1/11 10:27", "2019/1/11 10:33", "2019/1/11 10:36", "2019/1/11 10:55", "2019/1/11 10:57", "2019/1/11 11:33", "2019/1/11 12:49"]]
なので一つ足りないです。
私「質問のコードのviewDidLoadでprintした結果が正しいということですよね?」
あなた「そうです」
このやり取りはなんだったのでしょうか?
正しくないじゃないですか。
申し訳ございませんでした。
回答2件
あなたの回答
tips
プレビュー