我的应用程序已经运行了一段时间,但是今天早上我进行测试时,我遇到了线程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上看到过多种情况:致命错误,但是它并没有教我如何修复我的问题。预先谢谢您,
答案 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)
所以它会让我注销。成功注销应用程序后,便清理了项目。清除后,我再次运行我的应用程序,它又开始工作。这可能只是临时解决方案,但是,如果其他人遇到类似问题,我希望它可以对他们有所帮助。