XIB VC IBOutlet 的错误“不符合编码要求”

Posted

技术标签:

【中文标题】XIB VC IBOutlet 的错误“不符合编码要求”【英文标题】:Error "not coding-compliant" for XIB VC IBOutlet's 【发布时间】:2018-03-21 10:14:52 【问题描述】:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x101664480> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key label.' 当我像这样连接 IBOutlet 时为什么会出现此错误;@IBOutlet weak var label: UILabel!func viewDidLoad() super.viewDidLoad() label.text = "Hello World!" xib 文件的所有者设置为自定义 UIViewController 类UIViewController + xib 有什么特别之处吗?Connected IBOutlet

忽略import NightNightOutlets通过UITableView中的这个函数加载VC;func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) let topicVCName = UIViewController(nibName: categories[indexPath.section].refName[indexPath.row], bundle: nil) navigationController?.pushViewController(topicVCName, animated: true) 如果我拿走插座,xib 加载正常,没有错误。 (显然)

【问题讨论】:

你已经破坏了标签参考网点,在xib中查看 请使用inspector再检查 添加店铺图片 按⇧⌘F,输入label,回车,查看搜索结果并修复问题。 这将我指向文件所有者的出口 【参考方案1】:

答案就在错误信息中:

UIViewController 0x101664480

这证明了故事板中的视图控制器(或者视图控制器本身来自哪里)是一个普通的 UIViewController 而不是 SingleNumberVC。 SingleNumberVC确实有label属性,但是UIViewController没有!

你说过:

xib 的文件所有者设置为自定义 UIViewController 类

确实如此,否则你根本无法形成出口。但是当代码运行时,视图控制器本身并不是自定义的 UIViewController 类。您没有回答它来自哪里的问题,但我向您保证,无论在哪里,您都会发现您忘记指定 SingleNumberVC。

编辑哦,我明白了,这里是:

let topicVCName = UIViewController(nibName: categories[indexPath.section].refName[indexPath.row], bundle: nil)

在该行中将 UIViewController 更改为 SingleNumberVC

【讨论】:

有道理!那么在didSelectRowAt 中,常量“topicVCName”是否应该不是 UIViewController(....) 而应该是 SingleNumberVC(....)? @马特 这也是有道理的。但这只会pushViewController SingleNumberVC,而且我有更多的VC,而不仅仅是SingleNumberVC...你会怎么做? 我不知道你在说什么。我回答了你提出的问题。我(正确地)告诉了你崩溃意味着什么以及如何让崩溃消失。

以上是关于XIB VC IBOutlet 的错误“不符合编码要求”的主要内容,如果未能解决你的问题,请参考以下文章

仅在 iOS 8 中,iOS @IBOutlet 视图全部为零

为啥我必须在自定义 NIB / XIB 中连接 IBOutlet 两次?

如何从 XIB 文件访问 ViewController 中的 IBoutlet

在 .xib 中使用自定义 UIView 作为 IBOutlet

在不使用 IBOutlet 的 xib 中获取手势识别器的参考

如何检查是不是从 Swift 的 XIB 文件中单击了按钮?