質問編集履歴

1

コードを追加

2021/03/05 10:11

投稿

HayashiMasahiro
HayashiMasahiro

スコア3

test CHANGED
File without changes
test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  その後、**何故か、「既に遷移して、シュミレーターの画面も切り替わっているのにB画面のファイルでエラーが発生」**してしまいます!!
22
22
 
23
- そのエラーの内容は、一番下に載せておきます!!
23
+
24
24
 
25
25
 
26
26
 
@@ -28,55 +28,415 @@
28
28
 
29
29
  ```swift
30
30
 
31
- //MARK:Firebase/subliminalsから、該当するsubliminalを削除する
32
-
33
- //MARK:それと共にFirebase/Categorys/autoID/subliminals/からリレーションを削除する処理
34
-
35
- func deleteSubliminal(){
36
-
37
- //MARK:subliminalの削除=====================================
38
-
39
- //MARK:リファレンス作成
40
-
41
- let subliminalRef = Database.database().reference().child("subliminals").child(subliminalID)
42
-
43
- //MARK:subliminalを削除
44
-
45
- subliminalRef.removeValue()
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
- //MARK:categorys/autoID/subliminalsリレーションを削除=========
54
-
55
- //MARK:リファレンス作成
56
-
57
- let categorysRef = Database.database().reference().child("categorys")
58
-
59
- //MARK:categoryIDを一つづつ取り出して(複数のcategoryが存在する前提)
60
-
61
- for categoryAutoID in subliminaRelationCategorysKeyArray{
62
-
63
- //MARK:Categorys/autoID/subliminals配下の情報を削除
64
-
65
- //MARK:Categoeys/autoID/subliminals/[string:Bool]だけどsubliminals/stringだけで削除出来る
66
-
67
- let categorysSubliminalRef = categorysRef.child("(categoryAutoID)").child("subliminals").child(subliminalID)
68
-
69
- categorysSubliminalRef.removeValue()
31
+ class SubliminalShowViewController: UIViewController {
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+ //MARK:parts=====================================
40
+
41
+ @IBOutlet weak var tableView: UITableView!
42
+
43
+
44
+
45
+
46
+
47
+ //MARK:変数========================================
48
+
49
+ //MARK:categoryIndex RecategoryShowから引き継いだ一つのcategoryのインスタンス
50
+
51
+ var categoryArray = [Categorys]()
52
+
53
+ //MARK:RecategoryShowに紐付くsubliminalID(前画面から引継ぎ)
54
+
55
+ var subliminalID = String()
56
+
57
+ //MARK:subliminalIDを元に、Firebaseからの取得したsubliminalの情報(tableViewで利用)
58
+
59
+ var subliminalArray = [Subliminals]()
60
+
61
+ //MARK:subliminals/autoID/categoryID群の配列(subliminalArrayから取得)
62
+
63
+ var subliminaRelationCategorysArray = [String:Bool]()
64
+
65
+ //MARK:subliminaRelationCategorysArrayの連想配列からkeyだけ取得
66
+
67
+ var subliminaRelationCategorysKeyArray = [String]()
68
+
69
+ //MARK:subliminalに紐付いている写真の枚数(追加したphotoをFirebaseに保存する時に使用)
70
+
71
+ var subliminalPhotosCount = Int()
72
+
73
+
74
+
75
+
76
+
77
+ //MARK:初期設定
78
+
79
+ override func viewDidLoad() {
80
+
81
+ super.viewDidLoad()
82
+
83
+ }
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+ //MARK:毎回
92
+
93
+ override func viewWillAppear(_ animated: Bool) {
94
+
95
+ super.viewWillAppear(animated)
96
+
97
+ print("0.categoryArray(このsubliminalが所属しているcategoyのautoID)==================")
98
+
99
+ print(self.categoryArray[0].categoryID)
100
+
101
+ print("1.categoryArray(所属しているカテゴリー名)=====================================")
102
+
103
+ print(self.categoryArray[0].categoryTitle)
104
+
105
+ print("2.subliminalID(表示しているsubliminalのID)====================================")
106
+
107
+ print(self.subliminalID)
108
+
109
+ settingTableView()
110
+
111
+ settingNavigation()
112
+
113
+ settingUINib()
114
+
115
+ fetchSubliminalData()
116
+
117
+ }
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+ //MARK:setting==================================
128
+
129
+ //MARK:tableView
130
+
131
+ func settingTableView(){
132
+
133
+ self.tableView.delegate = self
134
+
135
+ self.tableView.dataSource = self
136
+
137
+ //MARK:未使用のCellを消去
138
+
139
+ tableView.tableFooterView = UIView()
140
+
141
+ //MARK:Cell上のButtonの遅延を無くす
142
+
143
+ tableView.delaysContentTouches = false
144
+
145
+
146
+
147
+ }
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+ //MARK:action=====================================
156
+
157
+
158
+
159
+
160
+
161
+ //MARK:「削除」Button
162
+
163
+ @objc func showAlertForDelete(){
164
+
165
+ let alertController = UIAlertController(title: "Subliminalの削除", message: "本当に削除してもよろしいですか?", preferredStyle: .alert)
166
+
167
+ let action1 = UIAlertAction(title: "キャンセル", style: .cancel) { (alert) in
70
168
 
71
169
  }
72
170
 
73
-
171
+ let action2 = UIAlertAction(title: "削除", style: .destructive) { (alert) in
172
+
74
-
173
+ self.deleteSubliminal()
174
+
175
+ }
176
+
177
+ alertController.addAction(action1)
178
+
179
+ alertController.addAction(action2)
180
+
181
+ self.present(alertController, animated: true, completion: nil)
182
+
183
+ }
184
+
185
+
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+
206
+
207
+ //MARK:method===================================
208
+
209
+ //MARK:FirebaseからSubliminalの情報を収集
210
+
211
+ //MARK:この場合、Subliminalは一つだけ取得
212
+
213
+ func fetchSubliminalData(){
214
+
215
+ //MARK:subliminal配下の一意のautoIDまでreferenceを取得
216
+
217
+ let subliminalRef = Database.database().reference().child("subliminals").child("(subliminalID)")
218
+
219
+ //MARK:reference配下の情報を塊にして取得
220
+
221
+ subliminalRef.observe(.value) { [self] (snapShot) in
222
+
223
+ //MARK:通信が終わったら呼ばれる
224
+
225
+ //MARK:snapShotからdataを引き出す
226
+
227
+ let snapShotData = snapShot.value as AnyObject
228
+
229
+ //MARK:取得したデータから、keyでvalueを取得(この段階では何型か判断出来ない)
230
+
231
+ let subliminalId = snapShotData.value(forKey: "subliminalId")
232
+
233
+ let subliminalTitle = snapShotData.value(forKey: "subliminalTitle")
234
+
235
+ let subliminalTitleImage = snapShotData.value(forKey: "subliminalTitleImage")
236
+
237
+ let subliminalDescription = snapShotData.value(forKey: "subliminalDescription")
238
+
239
+ let subliminalPhotos = snapShotData.value(forKey: "subliminalPhotos")
240
+
241
+ let categoryID = snapShotData.value(forKey: "categoryID")
242
+
243
+ //MARK:空判定する方法
244
+
245
+ var postDate:CLong?
246
+
247
+ if let postedDate = snapShotData.value(forKey: "postData") as? CLong{
248
+
249
+ postDate = postedDate
250
+
251
+ }else{
252
+
253
+ print("kara")
254
+
255
+ }
256
+
257
+
258
+
259
+ //MARK:postDataを時間に変換
260
+
261
+ let timeString = self.convertTimeStamp(serverTimeStamp: postDate!)
262
+
263
+ //MARK:Subliminalsモデルのインスタンスを生成(ここでダウンキャストしている)
264
+
265
+ let subliminal = Subliminals(
266
+
267
+ subliminalTitle: subliminalTitle as! String,
268
+
269
+ subliminalTitleImage: subliminalTitleImage as! String,
270
+
271
+ subliminalId: subliminalId as! String,
272
+
273
+ subliminalDescription: subliminalDescription as! String,
274
+
275
+ subliminalPhotos: subliminalPhotos as! Array<Any>,
276
+
277
+ postData: timeString,
278
+
279
+ categoryID: categoryID as! [String : Bool]
280
+
281
+ )
282
+
283
+ //MARK:配列の中を空へ
284
+
285
+ self.subliminalArray.removeAll()
286
+
287
+ //MARK:配列へSubliminalsモデルのinstanceを格納(tableViewで利用)
288
+
289
+ self.subliminalArray.append(subliminal)
290
+
291
+ //MARK:廃列へ格納したインスタンスから、subliminalPhotosの数を取得(新しくsubliminalPhotosをFirebaseに追加する時に利用する(Firebase保存で利用))
292
+
293
+ self.subliminalPhotosCount = self.subliminalArray[0].subliminalPhotos!.count
294
+
295
+ print("3.subliminalPhotosCount=======================")
296
+
297
+ print(subliminalPhotosCount)
298
+
299
+ //MARK:subliminalが所有しているcategoryIDの連想配列群を取得
300
+
301
+ self.subliminaRelationCategorysArray = self.subliminalArray[0].categoryID
302
+
75
- //MARK:該当のsubliminalとcategorysのリファレンスを削除した後CategoryShow画面に戻りたい
303
+ //MARK:subliminaRelationCategorysArray連想配列群からkeyだけを配列化
76
-
304
+
77
- self.navigationController?.popViewController(animated: true)
305
+ self.subliminaRelationCategorysKeyArray.append(contentsOf: subliminaRelationCategorysArray.keys)
306
+
78
-
307
+ print("4.subliminalが所属しているCategoryのautoID群=======================")
308
+
79
-
309
+ print(subliminaRelationCategorysKeyArray)
310
+
311
+ self.tableView.reloadData()
312
+
313
+ }
314
+
315
+ }
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+ //MARK:時間を人間が読める形に変換する
326
+
327
+ func convertTimeStamp(serverTimeStamp:CLong) -> String{
328
+
329
+ let x = serverTimeStamp / 1000
330
+
331
+ let date = Date(timeIntervalSince1970: TimeInterval(x))
332
+
333
+ let formatter = DateFormatter()
334
+
335
+ formatter.dateStyle = .long
336
+
337
+ formatter.timeStyle = .medium
338
+
339
+ return formatter.string(from: date)
340
+
341
+ }
342
+
343
+
344
+
345
+
346
+
347
+
348
+
349
+
350
+
351
+
352
+
353
+
354
+
355
+ //MARK:選択した画像を、Firebase/subliminals/subliminalPhotosに保存
356
+
357
+ func updataSubliminalPhotos(selectedImage:UIImage){
358
+
359
+ //MARK:リファレンスの形成====================================
360
+
361
+ //MARK:subliminals/autoID/subliminalPhotos迄のreference取得
362
+
363
+ let subliminalPhotoRef = Database.database().reference().child("subliminals").child("(subliminalID)").child("subliminalPhotos")
364
+
365
+ //MARK:Storageのreference取得
366
+
367
+ let storage = Storage.storage().reference(forURL: "gs://subliminalapp-1936e.appspot.com")
368
+
369
+ //MARK:Storageへ保存の為のkeyを作成(必須ではない)
370
+
371
+ let key = subliminalPhotoRef.child("subliminalPhotos").childByAutoId()
372
+
373
+ //MARK:StorageServerにパスを形成
374
+
375
+ let imageRef = storage.child("SubliminalImageView").child("(String(describing: key)).jpg")
376
+
377
+
378
+
379
+
380
+
381
+ //MARK:画像をデータ型へ変換==================================
382
+
383
+ //MARK:Data()のinstance
384
+
385
+ var subliminalImageViewData:Data = Data()
386
+
387
+ //MARK:圧縮データを作成
388
+
389
+ subliminalImageViewData = (selectedImage.jpegData(compressionQuality: 0.01))!
390
+
391
+
392
+
393
+
394
+
395
+
396
+
397
+
398
+
399
+ //MARK:画像をStorageへ保存==================================
400
+
401
+ let uploadTask = imageRef.putData(subliminalImageViewData, metadata: nil) { (metadata, error) in
402
+
403
+ //MARK:エラー処理
404
+
405
+ if error != nil{
406
+
407
+ print(error as Any)
408
+
409
+ return
410
+
411
+ }
412
+
413
+ print("Storage保存成功!!")
414
+
415
+ //MARK:成功時(urlを取得)
416
+
417
+ imageRef.downloadURL { (url, error) in
418
+
419
+ //MARK:エラー処理
420
+
421
+ if error != nil{
422
+
423
+ print(error as Any)
424
+
425
+ return
426
+
427
+ }
428
+
429
+ print("downloadURL成功")
430
+
431
+ //MARK:成功時(databaseへ値を保存)
432
+
433
+ subliminalPhotoRef.updateChildValues([ String(self.subliminalPhotosCount) : url?.absoluteString as Any])
434
+
435
+ }
436
+
437
+ }
438
+
439
+ }
80
440
 
81
441
  ```
82
442
 
@@ -84,8 +444,6 @@
84
444
 
85
445
  ### 発生している問題・エラーメッセージ
86
446
 
87
- ![イメージ説明](f26d67f2402a63308cf753b90f71baee.png)
88
-
89
447
 
90
448
 
91
449
  ```swift
@@ -103,13 +461,3 @@
103
461
 
104
462
 
105
463
  ```
106
-
107
-
108
-
109
- ### 不思議に思うこと
110
-
111
- 何故、既に、このファイルの画面(B)から、遷移元(A)の画面に移動しているにも関わらず、Bのファイルが反応しているのか不思議に思います !!
112
-
113
- 原因が分からず、困っています!!
114
-
115
- アドバイスよろしくお願いします!!