代码加载XIB视图报错:键值编码不兼容问题咨询
解决XIB加载时NSUnknownKeyException的问题
嘿,这个问题我之前也碰到过,其实就是XIB的关联关系搞混了,我来给你一步步捋清楚怎么解决:
错误原因分析
你遇到的NSUnknownKeyException,本质是XIB里的某个Outlet(就是那个rec...开头的控件)被关联到了ChatViewController,但你的ChatViewController类里并没有定义对应的IBOutlet属性——要么是你从来没加过这个属性,要么是属性被删除后XIB里的关联没清理干净,系统找不到对应的key就报错了。
而且你当前的类设置逻辑也有问题:你创建了VoiceRecView作为XIB的视图类,却把File's Owner设成了ChatViewController,这完全搞反了关联对象。
具体解决步骤
修正XIB的File's Owner设置
- 打开你的
VoiceRecView.xib文件 - 在左侧面板选中最顶部的「File's Owner」图标
- 切换到右侧的「Identity Inspector」(那个小身份证图标),把Class改成
VoiceRecView - 确认XIB里的View控件的Class已经是
VoiceRecView(这步你之前做对了,不用改)
- 打开你的
清理并重新关联Outlet
- 打开
VoiceRecView.swift,确保你已经定义了对应的IBOutlet属性,比如:import UIKit class VoiceRecView: UIView { @IBOutlet weak var recButton: UIButton! // 对应你XIB里的rec开头控件 // 其他代码... } - 回到XIB,右键点击File's Owner,找到之前错误关联到ChatViewController的
rec...条目,点击叉号删除旧关联 - 重新把XIB里的控件拖到
VoiceRecView类里,建立正确的Outlet关联
- 打开
在ChatViewController中正确加载XIB
- 不要直接加载XIB的view,而是实例化
VoiceRecView对象,代码示例:class ChatViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 加载XIB并创建自定义视图实例 guard let voiceRecView = Bundle.main.loadNibNamed("VoiceRecView", owner: nil, options: nil)?.first as? VoiceRecView else { return } // 设置视图的位置和大小 voiceRecView.frame = CGRect(x: 20, y: view.frame.height - 120, width: view.frame.width - 40, height: 100) // 添加为子视图 view.addSubview(voiceRecView) } } - 这里
owner传nil就好,因为我们已经把XIB的File's Owner设为VoiceRecView,系统会自动完成视图和类的关联。
- 不要直接加载XIB的view,而是实例化
最后一步:清理项目再编译
- 按下
Command+Shift+K清理项目缓存,然后重新编译运行,这个错误应该就消失了。
- 按下
内容的提问来源于stack exchange,提问作者Elena Rubilova
相关产品推荐
相关产品推荐

