我试图将UILabel与在类中创建的IBOutlet链接起来。

我的应用程序崩溃与以下错误。

这是什么意思?

我该怎么解决呢?

***终止应用由于未捕获异常'NSUnknownKeyException',原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:这个类不是键值编码兼容的键XXX。'


当前回答

我发现了另一种可能导致问题的可能性。

当使用initWithNibName方法使用错误的xib名称时,也会导致这种崩溃。

例如,您选择更改一个xib文件的名称,然后忘记将“initWithNibName”方法中使用的名称更改为相同的名称。

其他回答

您只需要指定IBOutlet一次,IBOutlet标签您的ivar是不必要的。 你在用你的UIViewController实例化你的NIB吗?在某些时候,你应该调用[SecondView initWithNibName:@"yourNibName" bundle:nil];

你的视图控制器可能在xib中有错误的类。

我下载了你的项目。

你得到的错误是

'NSUnknownKeyException',原因:'[<UIViewController 0x3927310> setValue:forUndefinedKey:]:这个类不是键值编码兼容的键字符串。'

这是由主窗口中的第二个视图控制器引起的。xib有一个UIViewController类而不是SecondView。更改到正确的类可以解决这个问题。

顺便说一下,在Objective-C中使用"string"这样的名字是不好的做法。它会引起运行时命名冲突。即使是在一次性练习应用程序中也要避免使用它们。命名冲突很难追踪,你不想浪费时间。

这个错误的另一个可能的原因是:当从一个控制器复制和粘贴元素到另一个控制器时,Xcode以某种方式保留了原始控制器的链接,即使在编辑和重新链接这个元素到新的控制器之后。

造成这个错误的另一个可能原因是:

糟糕的出口。

您在.h文件中删除或重命名了一个出口名称。

在.xib或.storyboard文件的连接检查器中删除它。

还有一个可能的原因

(在我的情况下)扩展带有可绑定属性的UIView,并为这些可绑定属性设置值(即阴影,角半径等),然后从UIView扩展中删除这些属性(出于某种原因),但以下<userDefinedRuntimeAttributes>保留在xml (of foo.storyboard)中:

<userDefinedRuntimeAttributes>
  <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
      <color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
      <real key="value" value="50"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="point" keyPath="shadowOffset">
      <point key="value" x="5" y="5"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
      <real key="value" value="16"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="borderWidthValue">
      <real key="value" value="0.0"/>
  </userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>

解决方案:右键单击foo。删除导致问题的</userDefinedRuntimeAttributes

我也有同样的问题。我重置了模拟器。删除和添加按钮控件。终于搞干净了。:)由于堆栈溢出。不知怎么的,我的代码变得很好,开始工作。

通过在Storyboard/xib接口中选择有问题的对象并打开连接检查器(视图->Utilities->显示连接检查器)来检查是否有丢失的引用出口。如果您确实删除了不需要的连接,您应该可以继续。

我发现的另一个“不兼容”问题是当我出于某种原因设法拥有两个类副本时。

我给错误的副本加了密钥。Interface Builder仍然看到键,并让我连接到它们,但在运行时,它正在使用没有新键的类的另一个副本。

为了找到“正确”的副本,我使用XCode的cmd-点击类名跳转到正确的副本,然后我杀死了不好的未使用的副本(先从未使用的副本中带来我的编辑)。

这个故事的寓意:重复的类文件是不好的。