'尽管每个属性都有值,但在展开Optional值时意外发现nil为#

时间:2017-11-22 19:28:56

标签: swift firebase firebase-realtime-database

我正在构建我的第一个Swift / iOS应用程序。我目前正在使用Firebase作为数据库。

我一直面临一个令人沮丧的问题,在填写注册表单后点击注册按钮时,我收到以下错误:

 func handleRegister() {
        if let email = emailTextField.text, let password = passwordTextField.text, let fullName = fullNameTextField.text, let age = Int(ageTextField.text!), let username = userNameTextField.text {

            Auth.auth().createUser(withEmail: email, password: password ) { (user, error) in
                // ...

                if let firebaseError = error {
                    print(firebaseError.localizedDescription)
                    return
                }

                let userID = user!.uid

                //Instantiate our User model - set key values equal to optionals above from sign up form
                let userAccount = User(userId: userID, email: email, fullName: fullName, age: age, username: username)

                //Initialize an empty dictionary to hold the keys and values to upload to Firebase
                var userAccountDict = [String:AnyObject]()

                //Use a dictionary method to update the keys and matching values. The values are the ones from UserAccount model's properties and the keys are what we decide we want them to be named in FirebaseDatabase. Use these keys to extract the values
                userAccountDict.updateValue(userAccount.userId as AnyObject, forKey: "userId")
                userAccountDict.updateValue(userAccount.email as AnyObject, forKey: "email")
                userAccountDict.updateValue(userAccount.fullName as AnyObject, forKey: "fullName")
                userAccountDict.updateValue(userAccount.age as AnyObject, forKey: "age")
                userAccountDict.updateValue(userAccount.username as AnyObject, forKey: "username")


                //Upload dictionary with the keys and values set above. The database will hold these key/value pairs under the "users" node.
                self.ref.child("users").child(user!.uid).setValue(userAccountDict)
                print("User registered in Firebase with a userId of " + user!.uid)


            }
        }
    }

当我看到这个物体时,每个物业似乎都有它的价值。这是我的Firebase注册功能:

//    REGISTER BUTTON
    let registerButton: UIButton = {
        let button = UIButton(type: UIButtonType.system)
        button.isHidden = true
        button.isEnabled = false
        button.backgroundColor = UIColor.red
        button.setTitle("Register", for: UIControlState.normal)
        button.setTitleColor(.white, for: UIControlState.normal)
        button.titleLabel?.font = UIFont(name: "Futura", size: 16)
        button.layer.cornerRadius = 5
        button.clipsToBounds = true
        button.translatesAutoresizingMaskIntoConstraints = false

        button.addTarget(self, action: #selector(handleRegister), for: .touchUpInside)
        button.addTarget(self, action: #selector(toAppFeed), for: UIControlEvents.touchUpInside)


        return button
    }()

注册流程目前以编程方式完成,而不是故事板。这是按钮,我最终调用handleRegister()函数:

{{1}}

以下是我在控制台旁边的左侧窗格中看到的内容: enter image description here

我唯一看到的是nil是错误,我认为应该是nil,因为Firebase不会抛出任何错误。即便如此,它还不在我发布到Firebase的对象中。我应该提一下,当我检查Firebase时,我会看到我创建的每个用户,但是我从handleRegister()函数收集的用户数据都没有保存到数据库中。

我已经和Firebase合作了几个月了,之前没有遇到过这个问题。我已经查看了其他SO问题,但似乎都没有解决这个具体问题。在这一点上我唯一能想到的是,当调用handleRegister()时,某些内容仍为nil,之后会获得一个值。但我不确定。

对此非常感谢。

编辑 - 在'注册'之后错误显示的位置填写表格后按下: enter image description here

2 个答案:

答案 0 :(得分:0)

某些东西确实被强行打开了,但这不是我的变数。

Firebase参考最初设置为

ref: DatabaseReference!

在self.ref.child中,ref需要一个?:

self.ref?.child

当然,控制台没有透露太多。所以ref被强行打开了,当我在handleRegister()函数中使用它时,我没有检查确定它是否存在。

我也忘了在viewDidLoad()中实例化我的Firebase引用。

答案 1 :(得分:-1)

您尝试使用键引用分配字典中的值,但是这些键尚未提供,而且问题就是我。

这是解决方案 var userAccountDict = [String:Any]()

userAccountDict [" userId"] = userAccount.userId 等等...

祝你好运:)