调用Predicate evaluate触发NSUnknownKeyException崩溃问题求助
NSUnknownKeyException:UserXML类不支持identifier键的KVC问题 这个崩溃我之前排查过好几次,本质就是系统通过键值编码(KVC)访问UserXML类里的identifier属性时找不到对应的入口,咱们一步步来搞定:
核心原因
当调用predicate.evaluate(with:)时,谓词会尝试通过KVC机制获取identifier属性的值,但你的UserXML类要么没声明这个属性,要么属性不满足KVC的访问要求,导致抛出NSUnknownKeyException。
具体解决步骤
第一步:检查
UserXML类的属性声明
打开你的UserXML类文件,确认是否存在identifier属性:- 如果是Swift类,要确保属性是
@objc dynamic修饰的(因为KVC依赖Objective-C运行时),正确写法如下:class UserXML: NSObject { // 必须继承NSObject才能支持KVC @objc dynamic var identifier: String? // 其他属性... } - 如果是Objective-C类,要确保有
@property声明:@interface UserXML : NSObject @property (nonatomic, copy) NSString *identifier; @end
如果没有这个属性,直接添加即可。
- 如果是Swift类,要确保属性是
第二步:核对属性名称的拼写和大小写
仔细检查谓词里写的键名是不是identifier,和类里的属性名完全一致——比如别把类里的id或者Identifer(大写I)和谓词里的identifier搞混了,大小写和拼写必须丝毫不差。第三步:排查XIB/Storyboard的无效绑定
如果UserXML类和界面文件绑定过,有时候不小心会把控件的IBOutlet关联到不存在的identifier属性上,这也会触发同样的错误。打开对应的XIB/Storyboard,检查所有IBOutlet的关联,把指向identifier的无效绑定删掉。第四步:如果是Core Data实体类
要是UserXML是Core Data的实体,先检查.xcdatamodeld数据模型里有没有添加identifier属性,然后重新生成实体类(Xcode菜单:Editor > Create NSManagedObject Subclass),确保类文件和模型同步。
验证方法
添加完属性或者修正后,重新运行项目,调用predicate.evaluate(with:)时应该就不会崩溃了。如果还是有问题,可以在调用前打印userXMLObject.value(forKey: "identifier"),看看是否能正常获取值,以此验证KVC是否能正确访问该属性。
内容的提问来源于stack exchange,提问作者Khwan Siricharoenporn

