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

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

ただいまの
回答率

87.78%

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

受付中

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 274

score 63

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

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

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

let userID = Auth.auth().currentUser?.uid
//全て実装完了してます
func writeToDB()
    {
        let email = emailAdress.text
        let password = passWord.text

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

        guard let Email = email, let Password = password else { return }

        Auth.auth().createUser(withEmail: Email, password: Password) { result, error in
            let userInfo = ["mail": self.emailAdress.text, "password": self.passWord.text, "username": self.userName.text]
            let userCoordinate = ["latitude": latitudeSt, "longitude": longitudeSt]
            self.ref.child("users").child(self.userID!).setValue(userInfo)
            self.ref.child("users").child(self.userID!).child("coordinate").setValue(userCoordinate)
            self.userDefaults.set(self.userID, forKey: "ID")
            print("OK")
        }

    }
func rewriteToDB(){

     //Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valueのエラーが出ています。
        guard let key = ref.child("users").child(self.userID!).child("coordinate").key else { return }
        let userCoordinate = ["latitude": latitude.text, "longitude": longitude.text]
        let childUpdates = ["/users/\(userID)/\(key)/": userCoordinate]
        ref.updateChildValues(childUpdates)
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayabusabusash

    2020/01/31 09:24

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

    キャンセル

  • globalplus

    2020/02/01 02:07

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

    キャンセル

  • hayabusabusash

    2020/02/03 09:09

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

    キャンセル

回答 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 }

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る