首页 > 解决方案 > 如何从 Firebase 添加具有 setValue 的用户 在 ios 中读取和写入数据

问题描述

我是 Swift 的新手,我正在通过构建社交媒体应用程序来学习。我对尝试self.ref.child("users").child(user.uid).setValue(["username": username])在我的代码中实现感到震惊(来自https://firebase.google.com/docs/database/ios/read-and-write)。我一直遵循 Kasey Schlaudt 的说明,在本教程的这一点上https://youtu.be/GrRggN41VF0?t=619他尝试添加一个用户,setValue如我链接的 Firebase 文档中所示。我遇到的错误self.ref.child("users").child(user.uid).setValue(["username": username])

使用未解析的标识符“用户”和使用未解析的标识符“用户名”。

到目前为止,我的代码(与我signInPress函数中视频中的原始代码略有不同)是

import UIKit
import Firebase
import SwiftKeychainWrapper

class ViewController: UIViewController {
    
    
    @IBOutlet weak var UserImageView: UIButton!
    @IBOutlet weak var usernameField: UITextField!
    @IBOutlet weak var emailField: UITextField!
    @IBOutlet weak var passwordField: UITextField!
    
    
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
    }
    
    override func viewDidAppear(_ animated: Bool)
    {
        if let _ : Bool =  KeychainWrapper.standard.string(forKey: "uid") != nil
        {
            self.performSegue(withIdentifier: "toFeed", sender: nil)
        }
    }
    
    func storeUserData(userID: String)
    {
        //---------------------------problematic line---------------------------
        //from https://firebase.google.com/docs/database/ios/read-and-write
        //from https://youtu.be/GrRggN41VF0?t=619
        self.ref.child("users").child(user.uid).setValue(["username": username])
        ([
            "username": usernameField.text
        ])
    }
    
    @IBAction func signInPress(_ sender: Any)
    {
        //this way you make sure there is a property inside emailField.text and you have a variable you can easily use
        if let email = emailField.text, let password = passwordField.text
        {
            Auth.auth().signIn(withEmail: email, password: password)
            { (result, error) in
                if error != nil && self.usernameField.text!.isEmpty && self.UserImageView.image != nil
                {
                    Auth.auth().createUser(withEmail: email, password: password)
                    { (result, error) in
                        self.storeUserData(userID: (result?.user.uid)!)
                        KeychainWrapper.standard.set((result?.user.uid)!, forKey: "KEY_UID")
                        self.performSegue(withIdentifier: "toFeed", sender: nil)
                    }
                } else
                {
                    KeychainWrapper.standard.set((result?.user.uid)!, forKey: "KEY_UID")
                    self.performSegue(withIdentifier: "toFeed", sender: nil)
                    
                    
                }

            }
       }
    }

}

我非常感谢任何关于为什么 Kasey 不会发生错误以及我可能需要更改哪些内容才能执行相同过程的指示。先感谢您 !

标签: iosswiftfirebasefirebase-realtime-databasefirebase-authentication

解决方案


你实际上非常接近,更多的是一个错字问题。看到您的 storeUserData 函数需要一个名为 userID 的字符串吗?这就是存储该数据而不是user.uid

func storeUserData(userID: String) {
   let username = self.usernameField.text

   self.ref.child("users").child(userID).setValue(["username": username])
                           here  ^^^^^^ userID instead of user.uid
}

推荐阅读