火力基地迅速-此类不符合密钥的键值编码要求----- [英] firebase & swift - this class is not key value coding-compliant for the key -----

查看:56
本文介绍了火力基地迅速-此类不符合密钥的键值编码要求-----的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道还有其他类似的问题,但是我认为我的问题出在我访问Firebase的方式而不是出口上,因为我的错误在@IBAction函数中,可以在发生错误之前调用它.

I know there are other questions like this but I think my problem is with how I'm accessing firebase and not an outlet because my error is in an @IBAction function that is able to be called before the error happens.

@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",因为错误不仅表明,

I believe the error is at the top where it says "op_user.user_ref?.valueForKey("current_status"))! as String == "OUT"" because not only does the error say,

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")"才终止.

but when going through the debugger, the program didn't terminate until "valueForKey("current_status")".

任何帮助将不胜感激!谢谢!

Any help would be appreciated! Thank you!

我的火力地堡:

{
  "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小时).

The goal of my project is to create a sign in/out app. My mentor wants others to be able to see if someone is signed in or not and wants to track how long in total someone has been signed in (like if they have reached 100 hours at the shop or something.)

推荐答案

您的问题是您尝试访问Firebase参考数据的方式. valueForKey不是正确的方法.您需要执行以下两项操作之一:

Your problem is the way you are trying to access the data of your Firebase reference. valueForKey isn't the right way to do it. You need to do one of two things:

  1. 首先将您的firebaseSnap.value转换为字典,然后使用dict [key]语法.
  2. Snapshot.childSnapshotForPath("current_status").value

我建议使用数字2作为最干净的方法.但是,如果您需要大量访问引用,则可能需要转换为字典,因为那样访问会更好.

I would recommend number 2, as the cleanest way to do it. But if you need to access the reference a lot, you may want to cast to dictionary because accessing it will look nicer that way.

注意:这两个都需要firebase事件监听器来获取firebase快照.

NOTE: Both of these require a firebase event listener to get the firebase snapshot.

让我知道您是否有任何疑问,祝您好运!

Let me know if you have any questions, and good luck!

这篇关于火力基地迅速-此类不符合密钥的键值编码要求-----的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆