Swift项目App崩溃:类不符合tableView的键值编码规范,求排查解决
解决“该类不符合键值编码规范,无法识别键tableView”崩溃问题
我帮你排查下这个问题——虽然你的users类已经继承了NSObject,但崩溃的核心原因是Firebase返回的字典里包含了tableView这个键,而你的users类并没有对应的属性,触发了KVC(键值编码)的错误。
为什么会崩溃?
当你调用user.setValuesForKeys(dictionary)时,KVC机制会遍历字典里的每一个键,尝试在users对象中找到对应的属性或者set<Key>:方法。如果某个键在类里找不到匹配项,就会抛出这个“无法识别键”的崩溃。这里明显是你的Firebase节点数据里混进了tableView这个多余的键值对。
几种解决方法:
方法1:过滤字典中的无效键
在给user赋值前,先把字典里的键过滤成users类已有的属性,只保留合法的键值对:
func getData(salval:String ) { self.tabArray.removeAll() ref = Database.database().reference() let userID = Auth.auth().currentUser!.uid if salval != "" { ref?.child("Schedule").child("Codaphic").child(salval).child(userID).observe(.childAdded, with: { (snapshot) in if let dictionary = snapshot.value as? [String : AnyObject] { // 列出users类所有已定义的属性名 let validKeys = ["cname", "_logi", "key", "wname", "address", "endtime", "_leti", "starttime", "date", "groupname", "month"] // 过滤字典,只保留有效键 let filteredDictionary = dictionary.filter { validKeys.contains($0.key) } let user = users() user.setValuesForKeys(filteredDictionary) self.tabArray.append(user) self.tableView1.reloadData() } }) } }
方法2:重写KVC的未定义键处理方法
如果你不想手动过滤字典,可以在users类里重写setValue(_:forUndefinedKey:)方法,直接忽略掉未定义的键,避免崩溃:
import UIKit class users : NSObject { var cname : String? var _logi: String? var key : String? var wname : String? var address : String? var endtime : String? var _leti : String? var starttime : String? var date : String? var groupname : String? var month : String? // 重写方法,忽略未定义的键 override func setValue(_ value: Any?, forUndefinedKey key: String) { // 可选:打印日志,方便你排查哪些键是多余的 print("注意:检测到未定义的键 \(key),已自动忽略") } }
方法3:从根源清理数据
建议你登录Firebase控制台,检查Schedule/Codaphic/salval/userID路径下的所有数据,看看是不是不小心写入了tableView这个无效的键值对。如果是误操作导致的,直接删除这个键值对,就能从根源解决问题。
内容的提问来源于stack exchange,提问作者Muhammad Adeel Qureshi
相关产品推荐
相关产品推荐

