修复线程1:致命错误:展开一个可选值时意外发现nil

时间:2018-07-02 19:31:25

标签: swift xcode firebase

我的应用程序已经运行了一段时间,但是今天早上我进行测试时,我遇到了线程1:致命错误:在展开一个Optional值时意外地发现nil。我没有对我的代码进行任何更改,而且我不知道为什么突然弹出所有内容。错误消息属于

let uid = Auth.auth().currentUser?.uid
   Database.database().reference().child("users").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in
    if let dictionary = snapshot.value as? [String: AnyObject] {
        self.navigationItem.title = dictionary["name"] as? String
    }
    print (snapshot)
}, withCancel: nil)

在我的sideBarView中,同样的错误消息

//My other error is at func didselectrowat
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.delegate!.sidebarDidSelectRow(row: Row(row: indexPath.row))
}

//登录控制器

  Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
        if error != nil {
            print(error!)
            return
        }
       self.defaults.set(true, forKey: "User is logged in")
        let mainController = UINavigationController(rootViewController: CustomTabBarController())
        self.present(mainController, animated: true, completion: nil)
    }
}

我正在尝试创建一个侧边栏视图控制器,用户可以在其中选择其个人资料并进行更改。此代码在我的主控制器下。我插错了吗?我在线程1上看到过多种情况:致命错误,但是它并没有教我如何修复我的问题。预先谢谢您,

2 个答案:

答案 0 :(得分:0)

当您有一个可选值时,您应该假定它可以为nil,并且如果它为nil,则需要确定要执行的操作。

”?意思是:我知道这是一个可选的,如果它是nil,那么给我一个可选的值而不是崩溃。

”!意思是:我知道它是可选的,但我100%肯定它不能为零。如果我错了,请崩溃。

let uid = Auth.auth().currentUser?.uid

表示因为?在currentUser中?如果currentUser为nil,则您的应用不会崩溃,但会生成一个nil的uid。那么,如果它为零,您将怎么办?您决定。

在下一行

Database.database().reference().child("users").child(uid!)

“!”在uid中!表示“我100%确保uid不为nil,如果是,请崩溃”。然后您的应用程序按照您的要求进行。

“我更新了我的代码。我认为一切正确。但是我确定它不是。”那是真正的智慧。这是认真的。

由于currentUser == nil,我将找到所有设置currentUser的地方,检查是否有任何地方可以将currentUser设置为nil,以及为什么没有将其设置为nil的地方可以执行。如果某人不应该将其设置为nil,或者有人将其不应设置为nil,或者应该将其设置为non-nil,则该对象不应为nil。

答案 1 :(得分:0)

我找到了自己问题的答案。我不确定这是否会帮助其他人,但它对我有帮助。我所做的就是删除

let uid = Auth.auth().currentUser?.uid
Database.database().reference().child("users").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
    self.navigationItem.title = dictionary["name"] as? String
}
print (snapshot)
}, withCancel: nil)

所以它会让我注销。成功注销应用程序后,便清理了项目。清除后,我再次运行我的应用程序,它又开始工作。这可能只是临时解决方案,但是,如果其他人遇到类似问题,我希望它可以对他们有所帮助。