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

質問編集履歴

1

コードを追加

2021/03/05 10:11

投稿

HayashiMasahiro
HayashiMasahiro

スコア3

title CHANGED
File without changes
body CHANGED
@@ -9,39 +9,218 @@
9
9
 
10
10
  このコードにより、確かにfirebase上の値は削除され、遷移元の画面(A)には戻るのですが、
11
11
  その後、**何故か、「既に遷移して、シュミレーターの画面も切り替わっているのにB画面のファイルでエラーが発生」**してしまいます!!
12
- そのエラーの内容は、一番下に載せておきます!!
13
12
 
14
13
 
14
+
15
15
  ```swift
16
+ class SubliminalShowViewController: UIViewController {
17
+
18
+
19
+
20
+ //MARK:parts=====================================
21
+ @IBOutlet weak var tableView: UITableView!
22
+
23
+
24
+ //MARK:変数========================================
25
+ //MARK:categoryIndex → RecategoryShowから引き継いだ一つのcategoryのインスタンス
26
+ var categoryArray = [Categorys]()
27
+ //MARK:RecategoryShowに紐付くsubliminalID(前画面からの引継ぎ)
28
+ var subliminalID = String()
16
- //MARK:Firebase/subliminalsから、該当するsubliminalを削除する
29
+ //MARK:subliminalIDを元に、Firebaseからの取得したsubliminalの情報(tableViewで利用)
30
+ var subliminalArray = [Subliminals]()
17
- //MARK:それと共にFirebase/Categorys/autoID/subliminals/からリレーションを削除する処理
31
+ //MARK:subliminals/autoID/categoryID群の配列(subliminalArrayから取得)
32
+ var subliminaRelationCategorysArray = [String:Bool]()
33
+ //MARK:subliminaRelationCategorysArrayの連想配列型から、keyだけ取得
34
+ var subliminaRelationCategorysKeyArray = [String]()
35
+ //MARK:subliminalに紐付いている写真の枚数(追加したphotoをFirebaseに保存する時に使用)
36
+ var subliminalPhotosCount = Int()
37
+
38
+
39
+ //MARK:初期設定
40
+ override func viewDidLoad() {
41
+ super.viewDidLoad()
42
+ }
43
+
44
+
45
+
46
+ //MARK:毎回
47
+ override func viewWillAppear(_ animated: Bool) {
48
+ super.viewWillAppear(animated)
49
+ print("0.categoryArray(このsubliminalが所属しているcategoyのautoID)==================")
50
+ print(self.categoryArray[0].categoryID)
51
+ print("1.categoryArray(所属しているカテゴリー名)=====================================")
52
+ print(self.categoryArray[0].categoryTitle)
53
+ print("2.subliminalID(表示しているsubliminalのID)====================================")
18
- func deleteSubliminal(){
54
+ print(self.subliminalID)
55
+ settingTableView()
56
+ settingNavigation()
57
+ settingUINib()
58
+ fetchSubliminalData()
59
+ }
60
+
61
+
62
+
63
+
64
+ //MARK:setting==================================
65
+ //MARK:tableView
66
+ func settingTableView(){
67
+ self.tableView.delegate = self
68
+ self.tableView.dataSource = self
69
+ //MARK:未使用のCellを消去
70
+ tableView.tableFooterView = UIView()
71
+ //MARK:Cell上のButtonの遅延を無くす
72
+ tableView.delaysContentTouches = false
73
+
74
+ }
75
+
76
+
77
+
19
- //MARK:subliminalの削除=====================================
78
+ //MARK:action=====================================
79
+
80
+
20
- //MARK:リファレンス作成
81
+ //MARK:「削除」Button
21
- let subliminalRef = Database.database().reference().child("subliminals").child(subliminalID)
22
- //MARK:subliminalを削除
23
- subliminalRef.removeValue()
82
+ @objc func showAlertForDelete(){
24
-
25
-
26
-
27
- //MARK:categorys/autoID/subliminalsのリレーションを削除=========
28
- //MARK:リファレンス作成
29
- let categorysRef = Database.database().reference().child("categorys")
30
- //MARK:categoryIDを一つづつ取り出して(複数のcategoryが存在する前提)
31
- for categoryAutoID in subliminaRelationCategorysKeyArray{
32
- //MARK:Categorys/autoID/subliminals配下の情報を削除
33
- //MARK:Categoeys/autoID/subliminals/[string:Bool]型だけど、subliminals/stringだけで削除出来る
34
- let categorysSubliminalRef = categorysRef.child("(categoryAutoID)").child("subliminals").child(subliminalID)
83
+ let alertController = UIAlertController(title: "Subliminalの削除", message: "本当に削除してもよろしいですか?", preferredStyle: .alert)
35
- categorysSubliminalRef.removeValue()
84
+ let action1 = UIAlertAction(title: "キャンセル", style: .cancel) { (alert) in
36
85
  }
37
-
86
+ let action2 = UIAlertAction(title: "削除", style: .destructive) { (alert) in
87
+ self.deleteSubliminal()
88
+ }
89
+ alertController.addAction(action1)
90
+ alertController.addAction(action2)
91
+ self.present(alertController, animated: true, completion: nil)
92
+ }
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+ //MARK:method===================================
105
+ //MARK:FirebaseからSubliminalの情報を収集
106
+ //MARK:この場合、Subliminalは一つだけ取得
107
+ func fetchSubliminalData(){
108
+ //MARK:subliminal配下の一意のautoIDまでreferenceを取得
109
+ let subliminalRef = Database.database().reference().child("subliminals").child("(subliminalID)")
110
+ //MARK:reference配下の情報を塊にして取得
111
+ subliminalRef.observe(.value) { [self] (snapShot) in
112
+ //MARK:通信が終わったら呼ばれる
113
+ //MARK:snapShotからdataを引き出す
114
+ let snapShotData = snapShot.value as AnyObject
115
+ //MARK:取得したデータから、keyでvalueを取得(この段階では何型か判断出来ない)
116
+ let subliminalId = snapShotData.value(forKey: "subliminalId")
117
+ let subliminalTitle = snapShotData.value(forKey: "subliminalTitle")
118
+ let subliminalTitleImage = snapShotData.value(forKey: "subliminalTitleImage")
119
+ let subliminalDescription = snapShotData.value(forKey: "subliminalDescription")
120
+ let subliminalPhotos = snapShotData.value(forKey: "subliminalPhotos")
121
+ let categoryID = snapShotData.value(forKey: "categoryID")
122
+ //MARK:空判定する方法
123
+ var postDate:CLong?
124
+ if let postedDate = snapShotData.value(forKey: "postData") as? CLong{
125
+ postDate = postedDate
126
+ }else{
127
+ print("kara")
128
+ }
129
+
130
+ //MARK:postDataを時間に変換
131
+ let timeString = self.convertTimeStamp(serverTimeStamp: postDate!)
132
+ //MARK:Subliminalsモデルのインスタンスを生成(ここでダウンキャストしている)
133
+ let subliminal = Subliminals(
134
+ subliminalTitle: subliminalTitle as! String,
135
+ subliminalTitleImage: subliminalTitleImage as! String,
136
+ subliminalId: subliminalId as! String,
137
+ subliminalDescription: subliminalDescription as! String,
138
+ subliminalPhotos: subliminalPhotos as! Array<Any>,
139
+ postData: timeString,
140
+ categoryID: categoryID as! [String : Bool]
141
+ )
142
+ //MARK:配列の中を空へ
143
+ self.subliminalArray.removeAll()
144
+ //MARK:配列へSubliminalsモデルのinstanceを格納(tableViewで利用)
145
+ self.subliminalArray.append(subliminal)
146
+ //MARK:廃列へ格納したインスタンスから、subliminalPhotosの数を取得(新しくsubliminalPhotosをFirebaseに追加する時に利用する(Firebase保存で利用))
147
+ self.subliminalPhotosCount = self.subliminalArray[0].subliminalPhotos!.count
148
+ print("3.subliminalPhotosCount=======================")
149
+ print(subliminalPhotosCount)
150
+ //MARK:subliminalが所有しているcategoryIDの連想配列群を取得
151
+ self.subliminaRelationCategorysArray = self.subliminalArray[0].categoryID
38
- //MARK:該当subliminalとcategorysのリファレンスを削除した後CategoryShow画面に戻りたい
152
+ //MARK:subliminaRelationCategorysArray連想配列群からkeyだけを配列化
39
- self.navigationController?.popViewController(animated: true)
153
+ self.subliminaRelationCategorysKeyArray.append(contentsOf: subliminaRelationCategorysArray.keys)
40
-
154
+ print("4.subliminalが所属しているCategoryのautoID群=======================")
155
+ print(subliminaRelationCategorysKeyArray)
156
+ self.tableView.reloadData()
157
+ }
158
+ }
159
+
160
+
161
+
162
+
163
+ //MARK:時間を人間が読める形に変換する
164
+ func convertTimeStamp(serverTimeStamp:CLong) -> String{
165
+ let x = serverTimeStamp / 1000
166
+ let date = Date(timeIntervalSince1970: TimeInterval(x))
167
+ let formatter = DateFormatter()
168
+ formatter.dateStyle = .long
169
+ formatter.timeStyle = .medium
170
+ return formatter.string(from: date)
171
+ }
172
+
173
+
174
+
175
+
176
+
177
+
178
+ //MARK:選択した画像を、Firebase/subliminals/subliminalPhotosに保存
179
+ func updataSubliminalPhotos(selectedImage:UIImage){
180
+ //MARK:リファレンスの形成====================================
181
+ //MARK:subliminals/autoID/subliminalPhotos迄のreference取得
182
+ let subliminalPhotoRef = Database.database().reference().child("subliminals").child("(subliminalID)").child("subliminalPhotos")
183
+ //MARK:Storageのreference取得
184
+ let storage = Storage.storage().reference(forURL: "gs://subliminalapp-1936e.appspot.com")
185
+ //MARK:Storageへ保存の為のkeyを作成(必須ではない)
186
+ let key = subliminalPhotoRef.child("subliminalPhotos").childByAutoId()
187
+ //MARK:StorageServerにパスを形成
188
+ let imageRef = storage.child("SubliminalImageView").child("(String(describing: key)).jpg")
189
+
190
+
191
+ //MARK:画像をデータ型へ変換==================================
192
+ //MARK:Data()のinstance
193
+ var subliminalImageViewData:Data = Data()
194
+ //MARK:圧縮データを作成
195
+ subliminalImageViewData = (selectedImage.jpegData(compressionQuality: 0.01))!
196
+
197
+
198
+
199
+
200
+ //MARK:画像をStorageへ保存==================================
201
+ let uploadTask = imageRef.putData(subliminalImageViewData, metadata: nil) { (metadata, error) in
202
+ //MARK:エラー処理
203
+ if error != nil{
204
+ print(error as Any)
205
+ return
206
+ }
207
+ print("Storage保存成功!!")
208
+ //MARK:成功時(urlを取得)
209
+ imageRef.downloadURL { (url, error) in
210
+ //MARK:エラー処理
211
+ if error != nil{
212
+ print(error as Any)
213
+ return
214
+ }
215
+ print("downloadURL成功")
216
+ //MARK:成功時(databaseへ値を保存)
217
+ subliminalPhotoRef.updateChildValues([ String(self.subliminalPhotosCount) : url?.absoluteString as Any])
218
+ }
219
+ }
220
+ }
41
221
  ```
42
222
 
43
223
  ### 発生している問題・エラーメッセージ
44
- ![イメージ説明](f26d67f2402a63308cf753b90f71baee.png)
45
224
 
46
225
  ```swift
47
226
  //MARK:postDataを時間に変換
@@ -50,9 +229,4 @@
50
229
  ここで以下のエラーが発生してしまいます。
51
230
         「Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value」
52
231
 
53
- ```
232
+ ```
54
-
55
- ### 不思議に思うこと
56
- 何故、既に、このファイルの画面(B)から、遷移元(A)の画面に移動しているにも関わらず、Bのファイルが反応しているのか不思議に思います !!
57
- 原因が分からず、困っています!!
58
- アドバイスよろしくお願いします!!