使用Segue跳转控制器遇NSUnknownKeyException异常求助
NSUnknownKeyException导致Segue跳转崩溃的问题 这个NSUnknownKeyException错误在iOS开发里太常见了,结合你说的情况——只打印操作完全正常,一执行performSegue就崩溃,大概率是和Segue跳转过程中的键值编码(KVC)绑定或者目标控制器的配置有关,咱们一步步来排查:
检查Segue标识符的拼写一致性
你代码里调用的应该是performSegue(withIdentifier: "gosegue", sender: self)吧?先去Storyboard里确认这个Segue的Identifier是不是和代码里的完全一致——iOS对标识符大小写敏感,别出现goSegue、goseguee这种拼写偏差,也别带多余空格。排查目标控制器的属性与绑定问题
如果你是在prepare(for segue: UIStoryboardSegue, sender: Any?)方法里用KVC方式传值(比如destinationVC.setValue(value, forKey: "targetProperty")),一定要确认:- 目标控制器里确实存在名为
targetProperty的属性,而且是var类型(不能是let); - 如果是Swift代码,这个属性最好加上
@objc修饰,因为KVC依赖OC运行时机制;
另外,也有可能是Storyboard里的IBOutlet绑定失效——比如你已经删掉了目标控制器里某个控件的IBOutlet代码,但Storyboard里还保留着旧的绑定关系,跳转时系统尝试设置不存在的键就会崩溃。可以右键点击目标控制器,看看有没有带红色感叹号的错误绑定,直接删掉即可。
- 目标控制器里确实存在名为
确认
prepare(for:)里的类型转换是否正确
获取目标控制器时,一定要确保类型转换准确,比如:override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "gosegue" { guard let destinationVC = segue.destination as? YourTargetViewController else { print("目标控制器类型转换失败") return } // 这里安全地传值 destinationVC.yourProperty = yourData } }如果类型转换错了(比如转成了别的控制器类),后续给不存在的属性赋值也可能触发这个异常。
检查Storyboard的控制器类绑定
去Storyboard里找到目标控制器,确认它的Custom Class是不是正确设置成了你编写的控制器类——别选错成其他类,也别出现类名拼写错误(比如你改了类名但没更新Storyboard里的配置)。
最后补充个小技巧:如果能把完整的错误信息贴出来会更高效,因为NSUnknownKeyException的完整报错会明确指出是哪个key找不到,比如reason: '[<YourViewController 0x12345678> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key xxx.',这个xxx就是直接定位问题的关键。
内容的提问来源于stack exchange,提问作者mrs.bassim

