teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

誤字がありました。

2020/09/02 19:08

投稿

SadajiroOkuno
SadajiroOkuno

スコア4

title CHANGED
File without changes
body CHANGED
@@ -144,9 +144,10 @@
144
144
  var dateOrder = [Date]()
145
145
  var editDic1 = [schedules]()
146
146
  var editDic2 = [schedules]()
147
+ var editDicAll = [schedules]()
147
148
  var editDic = [schedules]()
149
+    
148
150
 
149
-
150
151
  func combineInfosToSingleArray(editDic:[schedules]){
151
152
  self.editDic.removeAll()
152
153
  self.editDicAll = editDic1 + editDic2
@@ -165,7 +166,7 @@
165
166
  func displaySectionOnTop(editDic:[schedules]){
166
167
  var dateArray = [String]()
167
168
  for num in 0..<editDic.count{
168
- dateArray.append(v[num].date)
169
+ dateArray.append(editDic[num].date)
169
170
  }
170
171
  /****重複を消す****/
171
172
  let duplicateDAOS:NSOrderedSet = NSOrderedSet(array: dateArray)

5

codeを追加しました。

2020/09/02 19:08

投稿

SadajiroOkuno
SadajiroOkuno

スコア4

title CHANGED
File without changes
body CHANGED
@@ -128,4 +128,106 @@
128
128
  }
129
129
  ```
130
130
 
131
- ![イメージ説明](ac8802b46805147970cbb7a240b506f2.png)
131
+ ![イメージ説明](ac8802b46805147970cbb7a240b506f2.png)
132
+
133
+
134
+
135
+
136
+ ********************************************************
137
+ 解決致しました!
138
+ TsukubaDepotさんのリンクを参照しました。
139
+ https://teratail.com/questions/288703
140
+ コード記載は****マークで囲ってあります。
141
+ 解決したコード
142
+ ```ここに言語を入力
143
+ var schedule = [Date: [schedules]]()
144
+ var dateOrder = [Date]()
145
+ var editDic1 = [schedules]()
146
+ var editDic2 = [schedules]()
147
+ var editDic = [schedules]()
148
+
149
+
150
+ func combineInfosToSingleArray(editDic:[schedules]){
151
+ self.editDic.removeAll()
152
+ self.editDicAll = editDic1 + editDic2
153
+ editDic = self.editDicAll.sorted { ( ldate, rdate) -> Bool in
154
+ return ldate.date < rdate.date
155
+ }
156
+ ****ここにcompletionを入れて、firebaseから読み込んだ2つの違うデータを
157
+                        一つの配列に入れてから、次の処理へ移行するようにしました***
158
+ setGrouping(editDic: editDic, completion: {
159
+ self.displaySectionOnTop(editDic: self.editDic)
160
+ })
161
+ *************************************************
162
+ tableView.reloadData()
163
+ }
164
+
165
+ func displaySectionOnTop(editDic:[schedules]){
166
+ var dateArray = [String]()
167
+ for num in 0..<editDic.count{
168
+ dateArray.append(v[num].date)
169
+ }
170
+ /****重複を消す****/
171
+ let duplicateDAOS:NSOrderedSet = NSOrderedSet(array: dateArray)
172
+ let stringArray = duplicateDAOS.array as! [String]
173
+ let scheduleArray = stringArray.sorted { ( lDate, rDate) -> Bool in
174
+ return lDate < rDate
175
+ }
176
+ print("スケジュール配列: ",scheduleArray)
177
+
178
+ let date = Date()
179
+ let today = dateFormatter.string(from: date)
180
+ if let index = scheduleArray.firstIndex(of: today){
181
+ let indexPath = IndexPath(row: 0, section: index)
182
+ DispatchQueue.main.async {
183
+ self.tableView.scrollToRow(at: indexPath, at: .top, animated: false)
184
+ }
185
+ }else{
186
+ print("本日 ((today)) 予定はありませんでした。")
187
+
188
+ let filteredScheduleArray = scheduleArray.filter({ element in element > today })
189
+ if let nextScheDate = filteredScheduleArray.first{
190
+
191
+ let index = filteredScheduleArray.firstIndex(of: nextScheDate)
192
+ let getNextSection = scheduleArray.count - filteredScheduleArray.count
193
+ let section = getNextSection + index!
194
+ let indexPath = IndexPath(row: 0, section: section)
195
+ DispatchQueue.main.async {
196
+ self.tableView.scrollToRow(at: indexPath, at: .top, animated: false)
197
+ print("次の直近の予定日は (nextScheDate) で、要素番号は (section) です。")
198
+ }
199
+ }else{
200
+ let filteredScheduleArray = scheduleArray.filter({ element in element < today })
201
+ if let lastDate = filteredScheduleArray.last{
202
+ let section = filteredScheduleArray.firstIndex(of: lastDate)
203
+ let indexPath = IndexPath(row:0,section: section!)
204
+ DispatchQueue.main.async {
205
+ self.tableView.scrollToRow(at: indexPath, at: .top, animated: false)
206
+ print("直近の予定はありませんでした。")
207
+ print("前回の予定は (lastDate) で、要素番号は (section!) です。")
208
+ }
209
+ }else{
210
+ print("登録されている予定は 0 件です")
211
+ }
212
+ }
213
+ }
214
+ tableView.reloadData()
215
+ }
216
+ ****こちらの関数で@escaping()->()と,下記にDispatchQueue.main.async{completion()}を追加しました****
217
+ func setGrouping(editDic:[schedules], completion: @escaping()->()){
218
+
219
+ schedule = Dictionary(grouping: editDic){ project -> Date in
220
+ let date = dateFormatter.date(from: project.date)
221
+ return date ?? Date()
222
+ }
223
+ .reduce(into:[Date:[schedules]]()) { dic, tuple in
224
+ dic[tuple.key] = tuple.value.sorted { $0.date < $1.date}
225
+ }
226
+ dateOrder = Array(schedules.keys).sorted{ $0 < $1}
227
+ ******こちら********
228
+       DispatchQueue.main.async {
229
+ completion()
230
+ }
231
+     ******************
232
+ }
233
+ ```

4

写真を追加

2020/09/02 19:05

投稿

SadajiroOkuno
SadajiroOkuno

スコア4

title CHANGED
File without changes
body CHANGED
@@ -109,7 +109,7 @@
109
109
  let filteredScheduleArray1 = scheduleArray.filter({ element in element > today })
110
110
  print("配列、次の予定日時が始めに来る: ",filteredScheduleArray1)
111
111
  if filteredScheduleArray1.isEmpty == false{
112
- let nextSection = filteredScheduleArray1.startIndex
112
+ let nextSection = filteredScheduleArray1.startIndex + 1
113
113
  let indexPath = IndexPath(row: 0, section: nextSection)
114
114
  DispatchQueue.main.async {
115
115
  self.tableView.scrollToRow(at: indexPath, at: .top, animated: false)
@@ -126,4 +126,6 @@
126
126
  }
127
127
  tableView.reloadData()
128
128
  }
129
- ```
129
+ ```
130
+
131
+ ![イメージ説明](ac8802b46805147970cbb7a240b506f2.png)

3

修正コードの追加

2020/08/31 07:35

投稿

SadajiroOkuno
SadajiroOkuno

スコア4

title CHANGED
File without changes
body CHANGED
@@ -81,4 +81,49 @@
81
81
  ![イメージ説明](5c480952d8607bf425d8e94fc214e885.jpeg)
82
82
 
83
83
  全て配列に入りきってから配列番号を取得しようと試みるのですが、呼び出しの場所を変えても状態は変わらず。
84
- 改めてご教授頂ければと思います。よろしくお願いします。
84
+ 改めてご教授頂ければと思います。よろしくお願いします。
85
+
86
+
87
+ 修正コードはこちら
88
+ ```ここに言語を入力
89
+ /****重複を消す****/
90
+ let duplicateDAOS:NSOrderedSet = NSOrderedSet(array: dateArray)
91
+ let stringArray = duplicateDAOS.array as! [String]
92
+ let scheduleArray = stringArray.sorted { ( lDate, rDate) -> Bool in
93
+ return lDate < rDate
94
+ }
95
+ print("予定日時配列: ",scheduleArray)
96
+
97
+ let date = Date()
98
+ let today = dateFormatter.string(from: date)
99
+ print("今日の日付: ",today)
100
+
101
+ let section = scheduleArray.firstIndex(of: today)
102
+ if section != nil{
103
+ let indexPath = IndexPath(row: 0, section: section ?? 0)
104
+ DispatchQueue.main.async {
105
+ self.tableView.scrollToRow(at: indexPath, at: .top, animated: false)
106
+ }
107
+ }else if section == nil{
108
+
109
+ let filteredScheduleArray1 = scheduleArray.filter({ element in element > today })
110
+ print("配列、次の予定日時が始めに来る: ",filteredScheduleArray1)
111
+ if filteredScheduleArray1.isEmpty == false{
112
+ let nextSection = filteredScheduleArray1.startIndex
113
+ let indexPath = IndexPath(row: 0, section: nextSection)
114
+ DispatchQueue.main.async {
115
+ self.tableView.scrollToRow(at: indexPath, at: .top, animated: false)
116
+ }
117
+ }else if filteredScheduleArray1.isEmpty == true{
118
+ let filteredScheduleArray2 = scheduleArray.filter({ element in element < today })
119
+ let preSection = filteredScheduleArray2.endIndex + 1
120
+ print("配列、消化した日程最終日が最後に来る: ",filteredScheduleArray2)
121
+ let indexPath = IndexPath(row: 0, section: preSection)
122
+ DispatchQueue.main.async {
123
+ self.tableView.scrollToRow(at: indexPath, at: .top, animated: false)
124
+ }
125
+ }
126
+ }
127
+ tableView.reloadData()
128
+ }
129
+ ```

2

写真を追加

2020/08/31 07:29

投稿

SadajiroOkuno
SadajiroOkuno

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,10 +1,10 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
3
  いつも大変お世話になっております!
4
- TableViewに日付を昇順で並べています。
4
+ TableViewにsectionで日付を昇順で並べています。
5
- 起動したその日が2020/8/30とした場合、その日付のCellがTableViewの一番上に来るようにします。
5
+ 起動したその日が2020/8/30とした場合、その日付のsectionがTableViewの一番上に来るようにします。
6
- その日付がTableViewに存在するときは問題なく機能しましたが、その日付が存在しない場合、次の予定が一番上に来るように実装したいのです。
6
+ その日付が配列に存在するときは問題なく機能しましたが、配列に存在しない場合、次の予定が一番上に来るように実装したいのです。
7
-
7
+ ![イメージ説明](2ac0671a9b4e06a6180a69a5f146b088.png)
8
8
  ### 発生している問題・エラーメッセージ
9
9
 
10
10
  下記のコードのように、もし今日の日付が配列の中の日付に一致しなかった場合は、

1

誤字がありました。

2020/08/30 11:43

投稿

SadajiroOkuno
SadajiroOkuno

スコア4

title CHANGED
File without changes
body CHANGED
@@ -7,17 +7,16 @@
7
7
 
8
8
  ### 発生している問題・エラーメッセージ
9
9
 
10
- ```
11
10
  下記のコードのように、もし今日の日付が配列の中の日付に一致しなかった場合は、
12
11
  filterを使って本日以降の日付を新しく配列を作り入れます。
13
12
  その始めにくる日付の配列番号が想定する日付になるので番号を取り出せたらと思うのですが、
14
13
  記載したスクショの通り フィルター後の予定日時配列 が一度にfilteringされない為かnilになってしまい、
15
14
  番号が上手く取り出せません。
16
15
 
17
- もっと賢いやり方があるのかもしれませんが、どなたかお時間ある時にご教授頂ければ大変たすかります。
16
+ もっと賢いやり方があるのかもしれませんが、どなたかご教授頂ければ大変たすかります。
18
17
  何卒よろしくお願いいたします。
19
- ```
20
18
 
19
+
21
20
  ### 該当のソースコード
22
21
 
23
22
  ```ここに言語名を入力
@@ -73,9 +72,9 @@
73
72
 
74
73
  //let nextScheDate = filteredScheduleArray[0]
75
74
  //let section = filteredScheduleArray.firstIndex(of: nextScheDate)
76
- これら2行をコメントアウトすると以下2枚の写真のように順番に配列に足されていくことが確認できますが、一番始めは[]からになってます。
75
+ これら2行をコメントアウトすると以下の写真のように順番に配列に足されていくことが確認できますが、一番始めは[]からになってます。
77
76
 
78
- ![イメージ説明](804ae52b3676971ea353f9919d3b3549.png)![イメージ説明](75d3a0182c8921c682a0a3d1e6ac9f2c.png)
77
+ ![イメージ説明](75d3a0182c8921c682a0a3d1e6ac9f2c.png)
79
78
 
80
79
  例の2行をコメントアウトしなかった場合は落ちてしまいます。
81
80