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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

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

Q&A

1回答

856閲覧

Swift 異なるviewcontrollerからRealtimeDatabaseに上書きしたい

globalplus

総合スコア119

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

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

0グッド

2クリップ

投稿2020/01/22 08:58

FirstViewControllerでネーム、メアド、パス、座標をuserID以下に保存して
SecondViewControllerでイベントがあった時にSecondViewControllerで取得した座標をFirstViewControllerで作成したuserID以下の座標ノードに上書きしたいです。

エラーはSecondViewController内に記載しています。

アドバイスよろしくお願いします。

FirstViewController

1let userID = Auth.auth().currentUser?.uid 2//全て実装完了してます 3func writeToDB() 4 { 5 let email = emailAdress.text 6 let password = passWord.text 7 8 let latitudeSt: String = userDefaults.object(forKey: "lati") as! String 9 let longitudeSt: String = userDefaults.object(forKey: "longi") as! String 10 11 guard let Email = email, let Password = password else { return } 12 13 Auth.auth().createUser(withEmail: Email, password: Password) { result, error in 14 let userInfo = ["mail": self.emailAdress.text, "password": self.passWord.text, "username": self.userName.text] 15 let userCoordinate = ["latitude": latitudeSt, "longitude": longitudeSt] 16 self.ref.child("users").child(self.userID!).setValue(userInfo) 17 self.ref.child("users").child(self.userID!).child("coordinate").setValue(userCoordinate) 18 self.userDefaults.set(self.userID, forKey: "ID") 19 print("OK") 20 } 21 22 }

SecondViewController

1func rewriteToDB(){ 2 3     //Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valueのエラーが出ています。 4 guard let key = ref.child("users").child(self.userID!).child("coordinate").key else { return } 5 let userCoordinate = ["latitude": latitude.text, "longitude": longitude.text] 6 let childUpdates = ["/users/(userID)/(key)/": userCoordinate] 7 ref.updateChildValues(childUpdates) 8 }

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

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

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

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

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

hayabusabusash

2020/01/27 00:45

SecondViewControllerの userID が nil になってるとかはありませんか? guard let でアンラップする前に print(userID) とか追加して値を確認していただけませんか?
globalplus

2020/01/30 16:27

返信遅くなりすみません。 print(userID)の結果が Optional("7AdBZvTzjjMINFnLAekYblyHISL2") になり、FirstViewControllerで作成した "MXpj9fGBSSNW2lMzAFtVAnLFOgm1"と異なってしまっています。。。
hayabusabusash

2020/01/31 00:24

なるほど... 確認ありがとうございます????‍♂️ 結果が違うのも気になりますが、まずは Unexpectedly found nil while unwrapping an Optional value のエラーをなんとかしましょうか。 userID は SecondViewController のメンバー変数とかですか? あと、rewriteToDB()をどこで実行しているのか、userIDにIDをセットしている部分の処理を追記していただけるともう少しわかるかもしれません。
globalplus

2020/01/31 17:07

userIDは 共通定数let userID = Auth.auth().currentUser?.uidです rewiteToDBはSecondViewControllerないのlatiude,longitudeに表示している座標をデータベースに上書きするためのボタンです
hayabusabusash

2020/02/03 00:09

すみません遅くなりました。 共通定数というとAppDelegateとかグローバルなスコープで定義した定数になる感じですか? rewriteToDBはボタンタップ時の処理って感じですよね。 みた感じ他にアンラップしているところがなさそうなので、もし省略しているコードなどがあるなら載せていただけると何かわかるかもしれません。
guest

回答1

0

これだけだとなんとも言えないですが、、、

まず、forced unwrapを多用しすぎなのでやめましょう。
エラーの原因もそうですがそれでクラッシュしています。
emailとpasswordはguard let ~しているのだから、以下の2つも行いましょう。

let latitudeSt: String = userDefaults.object(forKey: "lati") as! String let longitudeSt: String = userDefaults.object(forKey: "longi") as! String

またuserIDもちゃんとunwrapしましょう

self.userID!

これを踏まえて、このコードはオプショナルでIDを保存してますが良いのでしょうか?

self.userDefaults.set(self.userID, forKey: "ID")

こういうことが起きるのでちゃんとunwrapしましょう。

話を進めると

//Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valueのエラーが出ています。

これはunwrapしてないためにクラッシュしています。

// before guard let key = ref.child("users").child(self.userID!).child("coordinate").key else { return } // after guard let id = self.userID, let key = ref.child("users").child(id).child("coordinate").key else { return }

とすることで回避できます。

投稿2020/02/03 15:07

h_crane

総合スコア171

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問