プログラミング初心者です。
現在、firestoreを用いてNumer0nというゲームを作っています。
今回、ユーザーのIDをRoomコレクションの中のroomname(変数)というドキュメントに保存して次の画面に移動したいのですが、アプリがクラッシュしてしまいます。
エラーメッセージで検索をかけるといくつか記事が出てくるのですが、firestore自体に値は保存されており、調べていくとどうやら画面遷移のタイミングでエラーが出てくるみたいです。
そこでif文等使ってコードを分けてみたのですがうまくいきませんでした。
他の非同期処理のコードは同じようにやってうまくいくので、何が原因なのかさえも分からなくなってしまいました。
どなたか教えてください。
前提・実現したいこと
ここに質問の内容を詳しく書いてください。
IDをドキュメントに保存したのちに画面遷移
エラーメッセージ Thread 1: Exception: "FIRESTORE INTERNAL ASSERTION FAILED: Invalid document reference. Document references must have an even number of segments, but Room has 1"
### 該当のソースコード @IBAction func decision(_ sender: UIButton) { if opt { let storyboard = UIStoryboard(name: "waitingRoomStoryboard", bundle: nil) let waitingViewController = storyboard.instantiateViewController(identifier: "waitingViewController") self.present(waitingViewController,animated: true,completion: nil) // 画面遷移 }else{ let defaltstore = Firestore.firestore() guard var roomname = roomnameText.text else { return } guard var password = passwordText.text else { return } let ffcd = defaltstore.collection("Room").document(roomname) // firestoreのインスタンス作成 ffcd.getDocument{(snapshot,err) in if let err = err { self.label.text = "部屋が存在しません❶" } guard let date = snapshot?.data() else { self.label.text = "部屋が存在しません❷" return } guard let roomPass = date["パスワード"] else {return} print(roomPass) //→.collection("Room")を省くと出力されない? if roomPass as? String == password{ guard let useruid = loginViewController.self.user?.uid else {return} print(useruid) ffcd.updateData(["メンバーID2": useruid]) self.label.text = "入室できました。" self.opt = true }else{ self.label.text = "パスワードが違います" } } } }
swift
試したこと
エラーコードの検索
firestoreのインスタンスを変える
optという変数を用いて、処理を分岐させる
補足情報(FW/ツールのバージョンなど)
補足になるのかわかりませんが、一度if optのelseの中身を全てコメントにし、ボタンを二回押したら画面遷移が起きるようにしてみたのですが、やはり画面遷移でアプリがクラッシュしてしまい、エラーコメントは同じでした
これは他のviewcontrollerに問題があるのでしょうか?
それともfirestoreのアクセス権的なのに問題があるのでしょうか?
はたまた画面遷移のコードに何か問題があるのでしょうか?
追記 7/19 16:48
遷移先を別の画面にしたらコードが通りました
もしかしたら、遷移先のviewdidload()の中にあったsunapshotlisner()との関係で何かあるのかもしれません
完全に解決したいので、どなたか分かる方いらっしゃったら教えてください
あなたの回答
tips
プレビュー