【问题标题】:Despite multiple unwrapping attempts, fatal error: unexpectedly found nil while unwrapping an Optional value尽管多次展开尝试,致命错误:在展开可选值时意外发现 nil
【发布时间】:2017-08-22 00:02:15
【问题描述】:

我一直在练习登录页面和创建 Firebase 帐户。我已成功注册用户并将用户保存在 firebase 中。现在,我试图在创建帐户时将名字和姓氏保存到用户 ID。我已经尝试查看其他 SO 答案,但似乎仍然无法使其正常工作。

我已经阅读了多个教程,并尝试了多次展开尝试,但一直遇到此错误。下面是我的视图控制器:

视图控制器

import UIKit
import Firebase

class ViewController: UIViewController {
    var ref: DatabaseReference!

    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var firstNameField: UITextField!
    @IBOutlet weak var lastNameField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        var ref = Database.database().reference()
    }

    @IBAction func createAccountTapped(_ sender: Any) {
        if let email = emailTextField.text, let password = passwordTextField.text, let firstName = firstNameField.text, let lastName = lastNameField.text {
            Auth.auth().createUser(withEmail: email, password: password ) { (user, error) in
                // ...

                if let firebaseError = error {
                    print(firebaseError.localizedDescription)
                    return
                //add popup later
                }


                let userId = user!.uid
                self.ref.child("users").child(userId).setValue(["firstName": firstName])
                print("User registered in Firebase with a userId of " + user!.uid)

                }
        }
    }

我哪里错了?我以为我正在用我的“如果让”解开顶部的变量。我也尝试单独强制解开它们,但仍然出现相同的错误。有点失落。

【问题讨论】:

  • 哪一行出现错误?
  • @ColGraff 这是我的 Firebase 数据库参考行:self.ref.child("users").child(userId).setValue(["firstName": firstName])
  • 也许是这个:let userId = user!.uid
  • 导致错误的行中的“多次展开尝试”在哪里?
  • 删除 viewDidLoad 中 'ref' 之前的 'var'

标签: swift firebase


【解决方案1】:

viewDidLoad(),你打电话

var ref = Database.database().reference()

但应该是

ref = Database.database().reference()

Swift 将其视为您在viewDidLoad() 范围内声明的不同变量,因此当您使用ref 时,它仍然没有任何价值。

【讨论】:

  • 天哪,现在太明显了。我欠你一杯啤酒。谢谢!
  • 哈哈,我会坚持下去的;-)
【解决方案2】:

请从

更改您的数据库引用
 var ref: DatabaseReference!

 var databaseRef = Database.database().reference()

然后做

 self.child("users").child(userId).setValue(["firstName": firstName])

或者在你看来DidLoad 做

self.ref = Database.database().reference()

这个错误是因为你没有初始化你的数据库引用

这应该没有任何问题

import UIKit
import Firebase
import FirebaseDatabase

class ViewController: UIViewController {
    var ref: DatabaseReference!

    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var firstNameField: UITextField!
    @IBOutlet weak var lastNameField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.ref = Database.database().reference()
    }

    @IBAction func createAccountTapped(_ sender: Any) {
        if let email = emailTextField.text, let password = passwordTextField.text, let firstName = firstNameField.text, let lastName = lastNameField.text {
            Auth.auth().createUser(withEmail: email, password: password ) { (user, error) in
                // ...

                if let firebaseError = error {
                    print(firebaseError.localizedDescription)
                    return
                //add popup later
                }


                let userId = user!.uid
                self.ref.child("users").child(userId).setValue(["firstName": firstName])
                print("User registered in Firebase with a userId of " + user!.uid)

                }
        }
    }

【讨论】:

  • 感谢您的回复。我最初尝试过,但是如果我不包含 var: ref DatabaseReference!,我会收到“使用未解析的标识符“数据库””
  • 那是因为你没有导入“ FirebaseDatabase”
猜你喜欢
  • 1970-01-01
  • 2016-01-26
  • 2016-02-29
  • 2020-09-19
  • 2016-01-08
相关资源
最近更新 更多