此类与键 XXX 的键值编码不兼容 - 类正确连接?

Posted

技术标签:

【中文标题】此类与键 XXX 的键值编码不兼容 - 类正确连接?【英文标题】:This class is not key value coding-compliant for the key XXX - class properly conencted? 【发布时间】:2017-03-09 19:29:44 【问题描述】:

首先,这不是What does this mean? "'NSUnknownKeyException', reason: … this class is not key value coding-compliant for the key X"的重复项

我已经查看了该问题和其他几个问题,并确保我的班级通过身份检查员和连接检查员进行了连接。我的班级也通过助手编辑器中的自动模式显示。

    if let currentUser = FIRAuth.auth()?.currentUser 

        ref = FIRDatabase.database().reference()
        ref.child("Teams").child(self.teamName.text!).setValue(["Name" : self.teamName.text!])
        ref.child("Teams").child(self.teamName.text!).setValue(["Number" : self.teamNumber.text!])
        ref.child("Teams").child(self.teamName.text!).setValue(["Password" : self.teamPassword.text!])
        ref.child("Teams").child(self.teamName.text!).setValue(["memberCount" : 1])
        print("1")

        let userName = "member" + String(1)
        let currentUserEmail = currentUser.uid
        ref.child("Teams").child(self.teamName.text!).child("memberList").setValue([userName : currentUserEmail])
        print("2")

        if let userteamcount = self.ref.child("Users").child(currentUser.uid).value(forKey: "teamCount") as? Int 
            let currentTeam = "team" + String(userteamcount + 1)
            print("4")
            self.ref.child("Users").child(currentUser.uid).setValue(["teamCount" : (userteamcount + 1)])
            print("5")
            self.ref.child("Users").child(currentUser.uid).child("joinedTeams").setValue([currentTeam : self.teamNumber.text!])
            print("6")
        
    

重要的一点是它会在发送错误之前打印出 1 和 2。

另外,这是我得到的具体错误:

1
2
Terminating app due to uncaught exception 'NSUnknownKeyException',    reason: 
'[<FIRDatabaseReference 0x618000054160> valueForUndefinedKey:]: 
this class is not key value coding-compliant for the key teamCount.'

非常感谢。

【问题讨论】:

child(currentUser.uid).value(forKey: "teamCount") 崩溃,因为您假设此 child 具有 teamCount 属性,但它没有。 【参考方案1】:
self.ref.child("Users").child(currentUser.uid).value(forKey: "teamCount") as? Int

您无法像这样从数据库中获取值。您需要观察引用以获取值。但似乎您正在尝试增加一个值,因此无论如何您都应该使用事务来执行此操作。因为如果你不这样做,当两个用户尝试同时增加它时,一个人的更改很有可能会覆盖另一个人(我个人觉得它也更具可读性)。方法如下。

self.ref.child("Users").child(currentUser.uid).child("teamCount").runTransactionBlock( (currentData: FIRMutableData) -> FIRTransactionResult in
  var teamCount = currentData.value as? Int
  if teamCount != nil 
    currentData.value = teamCount + 1
  
  return FIRTransactionResult.success(withValue: currentData)
)  (error, committed, snapshot) in
     if error == nil 
       // Update joinedTeams here
       let value = snapshot.value as? Int
       let currentTeam = "team\(value)"
       self.ref.child("Users").child(currentUser.uid).child("joinedTeams").child(currentTeam).setValue(self.teamNumber.text!)
     

这是您通常在没有事务的情况下从数据库加载 teamCount 的方式。

self.ref.child("Users").child(currentUser.uid).child("teamCount").observeSingleEvent(.value, with:  dataSnapshot in
  let teamCount = dataSnapshot.value as? Int
)

我还没有测试过代码,但我认为它应该可以工作。

链接:

Firebase Transactions

【讨论】:

以上是关于此类与键 XXX 的键值编码不兼容 - 类正确连接?的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的异常 'NSUnknownKeyException' - 此类与键 buttonPressed 的键值编码不兼容

此类与键 scrollView 的键值编码不兼容

情节提要:此类与键的键值编码不兼容

此类与键 XXXXXX 的键值编码不兼容

MPMediaItem 此类与键的键值编码不兼容

此类与键错误的键值编码不兼容