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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

2回答

1217閲覧

tableviewに表示されるべき時刻のずれ

hahum

総合スコア65

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/01/11 01:52

編集2019/01/15 09:06

ボタンを押したら記録とその時刻を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

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

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

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

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

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

fuzzball

2019/01/11 01:54

「数分前」ではなく具体的に書いて下さい。
fuzzball

2019/01/11 01:55

前半の質問と後半の質問は関連があるのでしょうか?無いのであれば質問を分けて下さい。
fuzzball

2019/01/11 02:18 編集

>>前の画面から値を受け取っているのですがそこの配列に入っている回数と時刻は正しかった 「正しかった」の検証方法と、なぜ正しいと判断したのかを書いて下さい。
fuzzball

2019/01/11 02:19

>>配列に入っている一つまえのものになってしまいます 一回目はどうなるのでしょうか?
hahum

2019/01/11 02:25

1回目の時は正しい時刻と回数でした。2回目からずれるようになりました。そこで配列を削除して確かめようとしたところ、配列を削除できませんでした。
fuzzball

2019/01/11 02:29

1回目 → 1回目のデータが表示される(正しい) 2回目 → 1回目のデータが表示される(2回目のデータが表示されない) 3回目 → 1回目、2回目のデータが表示される(3回目のデータが表示されない) ということでしょうか?
hahum

2019/01/11 02:32

そうです。
fuzzball

2019/01/11 02:35

>>print(.description)で確認したところ正しかったので というのは、質問のコードのviewDidLoadでprintした結果が正しいということですよね?
hahum

2019/01/11 02:39

前の画面はUserDefaultsで保存した後にprint()しました。 tableViewでも同じようにuserDefaultで取り出した後に確認しました。
fuzzball

2019/01/11 02:43

「userDefaultで取り出した後」というのはviewDidLoadのことですか?(違う言葉で返さないで下さい)
hahum

2019/01/11 02:45

そうです
fuzzball

2019/01/11 02:52

tableView(_:cellForRowAt:)の最初に、 print(indexPath.row, resultArray2[indexPath.row], dateArray2[indexPath.row]) を追加して、3回目のときの出力を教えて下さい。
hameji001

2019/01/11 03:52 編集

本題と外れ(?)。。。と完全には言えないですが、 「配列を削除できませんでした」周辺の間違いが2つありました。 editingStyle == .deleteのとこ、 間違いがありますので、print用い、コード見直してくださいね。 あと、viewdidloadはreloadDataでは読み込まれませんよ。
hahum

2019/01/11 04:01 編集

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があるのですが。
fuzzball

2019/01/11 04:02

このときの、viewDidLoadでの print("Array2:", Array2.description) の出力を教えて下さい。
hahum

2019/01/11 04:07

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"]] なので一つ足りないです。
fuzzball

2019/01/11 04:23

私「質問のコードのviewDidLoadでprintした結果が正しいということですよね?」 あなた「そうです」 このやり取りはなんだったのでしょうか? 正しくないじゃないですか。
hahum

2019/01/11 04:26

申し訳ございませんでした。
guest

回答2

0

ベストアンサー

話を総合すると、
①前の画面で保存 ②次の画面で読み込み
という手順で動くように作ったはずが、
②→①という順序で動いているのではないかと。

UserDefatulsへの保存ルーチンと読み込みルーチンで文字か何かprintしてみてそのタイミングを見ればすぐに判りそうです。

投稿2019/01/15 07:50

takabosoft

総合スコア8356

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

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

hahum

2019/01/15 18:01 編集

確かtableViewのviewdidloadが読み込まれてから前の画面のボタンが読み込まれていました。 順番は print("Array2:", Array2.description) print("Array1:", resultArray1.count) print(indexPath.row, resultArray2[indexPath.row], dateArray2[indexPath.row]) です。 なぜ次の画面であるtableViewのviewdidloadが先に読み込まれるのですか 追記1/16 if UserDefaults.standard.object(forKey: "save") != nil { Array2 = UserDefaults.standard.object(forKey: "save") as! [[String]] } self.resultArray2 = self.Array2[0] self.dateArray2 = self.Array2[1] Array2 = [resultArray2, dateArray2] をViewwillAppearに移したところ、うまく表示することができしたがコード的には合っているのでしょうか。心配なので質問させて頂きます。
takabosoft

2019/01/16 00:31

前の画面の保存位置がソース上から読み取れないので、何故かと言われてもなんとも言えません。 viewWillAppearでデータの読み込みをやっても良いですが、viewWillAppearは例えば他の画面に行って戻ってきた場合などにも呼ばれた気がするので、その辺にだけ気をつけてもらえばよいです。
hahum

2019/01/16 02:30

前の画面を全部貼ればわかりますか?
takabosoft

2019/01/16 02:34

貼ってもらっても判るとは限らないですよ。
guest

0

保存する前に遷移してるんじゃないですかね。

投稿2019/01/11 04:29

fuzzball

総合スコア16731

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

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

hahum

2019/01/11 08:38

ボタンをtableviewと紐づけてはいけないと言うことですか。
fuzzball

2019/01/11 08:55

「ボタンをtableviewと紐づけ」の意味が分かりません。
hahum

2019/01/15 08:47 編集

保存する前に遷移している原因はどこにありますか。 教えていただけないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問