【发布时间】:2016-09-10 17:10:42
【问题描述】:
我知道还有其他类似的问题,但我认为我的问题在于我如何访问 firebase 而不是插座,因为我的错误出现在 @IBAction 函数中,该函数可以在错误发生之前被调用。
@IBAction func sign_in_out_tapped(sender : UIButton) {
if let op_user = user {
if (op_user.user_ref?.valueForKey("current_status"))! as! String == "OUT" {
let sign_in_time = NSDate()
op_user.user_ref?.childByAppendingPath("logins").updateChildValues([String(op_user.user_ref?.valueForKey("num_of_logins")! as! Int + 1): ["sign_in_time": sign_in_time]])
signinout = SignInOutModel(sign_in_time: sign_in_time)
op_user.user_ref?.updateChildValues(["current_status": "IN"])
} else {
signinout!.sign_out_time = NSDate()
op_user.user_ref?.childByAppendingPath("logins").childByAppendingPath(String(user?.user_ref?.valueForKey("num_of_logins"))).updateChildValues(["sign_out_time": signinout!.sign_out_time!])
signinout!.duration = (op_user.user_ref?.childByAppendingPath("logins").childByAppendingPath(String(user?.user_ref?.valueForKey("num_of_logins"))).valueForKey("sign_in_time")?.timeIntervalSinceNow)!
op_user.user_ref?.childByAppendingPath("logins").childByAppendingPath(String(user?.user_ref?.valueForKey("num_of_logins"))).updateChildValues(["duration": signinout!.duration])
op_user.user_ref?.updateChildValues(["total_hours": (Double((op_user.user_ref?.valueForKey("total_hours"))! as! NSNumber) + signinout!.duration)])
}
} else {
let sign_in_alert = UIAlertController(title: "Sign in.", message: "What is your first and last name?", preferredStyle: UIAlertControllerStyle.Alert)
sign_in_alert.addTextFieldWithConfigurationHandler { textField in
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MainViewController.handleTextFieldTextDidChangeNotification(_:)), name: UITextFieldTextDidChangeNotification, object: textField)
}
func removeTextFieldObserver() {
NSNotificationCenter.defaultCenter().removeObserver(self, name: UITextFieldTextDidChangeNotification, object: sign_in_alert.textFields![0])
}
let cancel_action = UIAlertAction(title: "Cancel", style: .Cancel) { action in
print("Sign In Cancel Button Pressed")
removeTextFieldObserver()
}
let save_action = UIAlertAction(title: "Save", style: .Default) { action in
print("Sign Out Save Button Pressed")
let textField = sign_in_alert.textFields![0] as UITextField
if let user_name = textField.text {
var not_found = false
self.students_ref.childByAppendingPath(user_name).observeEventType(.Value, withBlock: { snapshot in
if (snapshot.value is NSNull) {
not_found = true
} else {
self.user = User(user_name: user_name)
self.user?.user_ref = self.students_ref.childByAppendingPath(user_name)
self.refresh_user_name_label()
}
})
if !not_found {
self.mentors_ref.childByAppendingPath(user_name).observeEventType(.Value, withBlock: { snapshot in
if (snapshot.value is NSNull) {
not_found = true
} else {
self.user = User(user_name: user_name)
self.user?.user_ref = self.mentors_ref.childByAppendingPath(user_name)
self.refresh_user_name_label()
}
})
} else {
self.error_message("User not found. Please update Firebase.")
}
} else {
self.error_message("Could not sign in.")
}
removeTextFieldObserver()
}
save_action.enabled = false
AddAlertSaveAction = save_action
sign_in_alert.addAction(cancel_action)
sign_in_alert.addAction(save_action)
self.presentViewController(sign_in_alert, animated: true, completion: nil)
if let _ = user {
let sign_in_time = NSDate()
signinout = SignInOutModel(sign_in_time: sign_in_time)
}
}
refresh_sign_in_out_button()
}
我相信错误出现在顶部,上面写着 "op_user.user_ref?.valueForKey("current_status"))! as String == "OUT"" 因为不仅错误说,
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Firebase 0x7fa12e0b5530> valueForUndefinedKey:]: this class is not key value coding-compliant for the key current_status.'
但是当通过调试器时,程序直到 "valueForKey("current_status")" 才终止。
任何帮助将不胜感激!谢谢!
编辑:我的火力基地:
{
"mentors" : {
"Ash Dreyer" : {
"current_status" : "IN",
"num_of_logins" : 0,
"total_hours" : 0
},
"Donald Pinckney" : {
"current_status" : "OUT",
"num_of_logins" : 0,
"total_hours" : 0
},
"Jasmine Zhou" : {
"current_status" : "OUT",
"num_of_logins" : 0,
"total_hours" : 0
},
"Michael Corsetto" : {
"current_status" : "OUT",
"num_of_logins" : 0,
"total_hours" : 0
}
},
"students" : {
"Bryton Moeller" : {
"current_status" : "OUT",
"num_of_logins" : 0,
"total_hours" : 0
},
"Kelly Ostrom" : {
"current_status" : "OUT",
"num_of_logins" : 0,
"total_hours" : 0
},
"Kyle Stachowicz" : {
"current_status" : "OUT",
"num_of_logins" : 0,
"total_hours" : 0
},
"Wesley Aptekar-Cassels" : {
"current_status" : "OUT",
"num_of_logins" : 0,
"total_hours" : 0
}
}
}
编辑:
我的项目的目标是创建一个登录/注销应用。我的导师希望其他人能够查看某人是否已登录,并希望跟踪某人总共登录了多长时间(例如他们是否在商店中达到了 100 小时或其他时间。)
【问题讨论】:
-
op_user.user_ref的类型是什么?current_status是一个有效的密钥吗? -
火力基地。是的,我在这里贴一张我的钥匙截图
-
您能否以文本形式发布您的 Firebase 代码以及您的 Firebase 结构(Firebase 仪表板->导出)。请不要使用屏幕截图,因为它会导致我们不得不在我们的答案中重新输入它。此外,还有很多可选项的展开 - 这使代码过于复杂。而且...您是否只是想查看带有 current_status 键的用户字典是否“out”?
-
@Jay 对不起,我对快速编程真的很陌生!是的,我正在尝试查看 current_status 是否为 OUT。对不起。
-
截图不见了!谢谢。您还可以发布用于读取 Firebase 数据的代码吗?
标签: ios swift firebase firebase-realtime-database