提问人: 提问时间:6/22/2010 最后编辑:26 revs, 16 users 36%Guillaume Dubois 更新时间:9/6/2023 访问量:1022507
Xcode - 如何修复“NSUnknownKeyException”,原因:“......此类不符合键值编码的键值 X“错误?
Xcode - How to fix 'NSUnknownKeyException', Reason: "… this class is not key value coding-compliant for the key X" error?
问:
我正在尝试将 a 与我的班级中创建的 a 链接起来。UILabel
IBOutlet
我的应用程序崩溃并出现以下错误”
***
Terminating app due to uncaught exception
'NSUnknownKeyException', reason:
'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:
this class is not key value coding-compliant for the key XXX.'
这是什么意思,我该如何解决?
答:
- 您只需要指定一次,您的ivar标签是不必要的。
IBOutlet
IBOutlet
- 您是否正在使用 ?在某些时候,您应该致电
UIViewController
[SecondView initWithNibName:@"yourNibName" bundle:nil];
评论
-initWithNibName
视图控制器的 xib 中可能有错误的类。
我下载了你的项目。
您得到的错误是
“NSUnknownKeyException”,原因:“[<UIViewController 0x3927310> setValue:forUndefinedKey:]:此类不符合键字符串的键值编码。
这是由于视图控制器具有 UIViewController
类而不是 SecondView
引起的。更改为正确的类可以解决问题。Second
MainWindow.xib
顺便说一句,在 Objective-C 中使用像“string”这样的名称是不好的做法。它会引起运行时命名冲突。即使在一次性练习应用程序中也要避免它们。命名冲突可能很难追踪,您不想浪费时间。
此错误的另一个可能原因:当将元素从一个控制器复制并粘贴到另一个控制器时,Xcode 会以某种方式保留与原始控制器的链接,即使在编辑并将此元素重新链接到新控制器之后也是如此。
此错误的另一个可能原因:
糟糕的出口。
您已删除或重命名文件中的插座名称。.h
在文件的“连接检查器”中将其删除。.xib
.storyboard
另一个可能的原因
(就我而言)使用可绑定属性扩展 UIView 并为这些可绑定属性(即阴影、拐角半径等)设置值,然后从 UIView 扩展中删除这些属性(出于某种原因),但以下内容仍保留在 xml (of ) 中:<userDefinedRuntimeAttributes>
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>
溶液:右键单击> Open as Source Code,>按 keyPath(即 shadowRadius)搜索 > 删除导致问题的foo.storyboard
</userDefinedRuntimeAttributes>
评论
我发现的另一个“不合规”问题是,由于某种原因,我设法拥有两个类副本。
我正在将密钥添加到错误的副本中。 Interface Builder 仍然看到这些键并让我连接到它们,但在运行时,它使用的是没有新键的类的另一个副本。
为了找到哪个是“正确”的副本,我使用 XCode 的 cmd 单击其他地方的类名以跳转到正确的副本,然后我杀死了坏的未使用副本(在首先从未使用的副本中引入我的编辑之后)。
这个故事的寓意是:重复的类文件是不好的。
对于一个有两个目标(有自己的MainWindow XIB)的项目,我遇到了类似的问题。导致我出现此错误的根本问题是 UIViewController 类未包含在第二个项目的资源列表中。即接口构建器允许我在 MainWindow.xib 中指定它,但在运行时系统无法找到该类。
I.e. cmd单击有问题的 UIViewController 类,并仔细检查它是否包含在“目标”选项卡中。
我遇到了同样的问题,虽然 TechZen 的答案可能确实令人惊讶,但我发现很难适用于我的情况。
最终,我通过“对象”下列出的控制器(下图中突出显示)而不是通过文件所有者链接标签来解决问题。
希望这会有所帮助。
我在情节提要时遇到了这个错误。上面的解决方案似乎不是问题,所以我最终删除了视图控制器并再次添加它(当然,重新连接 segue 并重新分配类)从而修复了它。我不知道它到底是什么,但是在开始之前不久,我已经重命名了关联的视图控制器类,所以也许这已经解决了一些问题。
评论
您的 xib 可能连接不良。
我遇到过很多次这个错误。虽然 TechZen 的答案在这种情况下是绝对正确的,但另一个常见原因是当您更改 .h/.m 中 IBOutlet 属性的名称时,您已经将其连接到笔尖中的文件所有者。
从您的笔尖:
另一个常见原因是,如果使用 Storyboard,则 UIButton 可能具有多个分配(解决方案与 nib 几乎相同):
评论
我不得不从模拟器/ iPhone中删除该应用程序以摆脱此错误。
评论
我遇到了同样的问题。我确实重置了模拟器。删除和添加按钮控件。最后做了一个干净的。:)感谢堆栈溢出。我的代码如何变得正常并开始工作。
如果它是仅限 iPhone 的应用程序,而不是通用应用程序,请确保以下字段为空:
目标>摘要> iPhone/iPod 部署信息>主界面
如果你在那里指定一个 xib,它就会崩溃。
评论
这可能是从您重命名或删除的 Xib Interface 中引用组件的情况。重新引用对我有用。
通常,当这种情况发生在我身上时,@TechZen的回答可以解决问题。然而,昨天,我花了很长的时间处理故事板连接,却发现问题出在我的代码中。
我有一个自定义视图控制器,可以处理情节提要中的各种布局,但其中一个布局需要其他布局未使用的特殊标签。所以我创建了一个子类,如下所示:
@interface MyViewControllerSubclass : MyViewController
然后我在 MyViewControllerSubclass.m 中添加了一个私有属性:
@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UILabel *crashesApp;
@end
Xcode 很高兴地允许我连接这个 IBOutlet,但每次加载视图时,应用程序都会崩溃,并显示旧的“不符合键值'chrashesApp'的键值”。
回想起来,解决方案是更改私有类别以使用正确的名称,即子类的名称:
@interface MyViewControllerSubclass ()
@property (weak, nonatomic) IBOutlet UILabel *noMoreCrashing;
@end
我也有同样的问题。我在 XIB 文件中创建了一个 tableviewCell,但遇到了这种错误。我的问题是我将“File's Owner”类定义为我的单元格视图控制器。我只是把它拿出来并设置单元格的类(在 xib 文件上单击单元格的边框,转到右侧面板上的第三个选项卡,其中显示类选择了您的视图控制器)。
此外,请尝试清理代码。
我只是在我的重复项目中遇到了这个问题,并通过检查 2 个地方解决了这个问题:
1- 确保列表中有 .m 文件 -> 项目 - 构建阶段 - 编译源代码
2- 之后,转到界面构建器(可能这是只有 IB 发生的错误)并取消链接所有属性、标签、图像等......然后重新链接所有。我意识到我已经删除了一个属性,但它仍然在 IB 中链接。
希望它对某些人有用。
提出了同样的问题。我的解决方案是将正确的情节提要值放在“主情节提要”下拉列表中。我重命名了mainstoryboard.storyboard,但没有重置部署信息。
造成这种情况的另一个原因是,您将此属性声明为@dynamic实现,但类在父类中找不到它。
如果要在 Interface Builder 中的单独 XIB 文件中设计一个小子视图,并且在 IB 中将其设置为与父视图相同的类,也会出现此问题。
如果你然后像这样显示它:
UIViewController *vc = [[UIViewController alloc] initWithNibName:@"NameOfTheSubviewNibFile" bundle:nil];
[self.view addSubview:vc.view];
将显示该视图,但如果它已连接到其文件所有者,您将收到错误消息。因此,这应该起作用:IBOutlets
- 在父视图的代码中,声明 an 以引用子视图的 nib 文件中的视图
IBOutlet UIView *mySubview
- 在子视图的 nib 文件中,将“文件所有者”连接到视图,并将其设置为
mySubview
- 通过执行以下操作来显示它:
[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil] [self.view addSubview:mySubview];
你会没事的!
通过在 Storyboard/xib 界面中选择有问题的对象并打开 Connections Inspector (View->Utilities->Show Connections Inspector),检查是否有杂散的 Referencing Outlets。如果您确实删除了不需要的连接,您应该可以开始了。
此错误表示已连接的 Interface Builder 对象在其所有者的源(文件的所有者)中被删除/重命名。
在界面构建器中按住 Control 键单击“文件所有者”,如果看到感叹号,则需要修复该问题。
在下图中,您可以看到“aRemovedView”的右侧有一个感叹号,这是因为我在 IB 中连接了 IBOutlet 视图对象时删除了它。
这给出了以下错误:由于未捕获的异常“NSUnknownKeyException”而终止应用,原因:“[ setValue:forUndefinedKey:]:此类不符合键 aRemovedView 的键值编码。
评论
我从头文件中删除了该属性。我找不到任何对它的引用,但调试错误仍在引用它。我发现笔尖文件仍然有对它的引用。我删除了引用它的块,一切都得到了修复。
在 Project Navigator 中,
找到笔尖 (xib) 文件。单击鼠标右键,查看源代码。我删除了以下完整部分
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">DeleteLabel</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="774585933"/>
</object>
<int key="connectionID">20</int>
</object>
当我的视图控制器最初有一个 .xib 文件,但现在是以编程方式创建的时,我就会发生这种情况。
即使我已经从这个项目中删除了 .xib 文件。用户的 iPhone/iPad 可能包含此视图控制器的 .xib 文件。
尝试加载 .xib 文件通常会导致以下崩溃:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'
以编程方式创建它时的解决方案可能是这样的:
-(void)loadView {
// Ensure that we don't load an .xib file for this viewcontroller
self.view = [UIView new];
}
评论
我发现了另一种可能导致问题的可能性。
当使用带有错误 xib 名称的“initWithNibName”方法时,也会导致这种崩溃。
例如,您选择更改 xib 文件的名称,然后 foget 将 “initWithNibName” 方法中使用的名称更改为相同的名称。
我记得过去遇到过类似的问题,我通过更改行解决了它:
_vicMain = [[UIViewController alloc] initWithNibName:@"vicMainScreen" bundle:nil];
到:
#include "vicLogin_iPad.h" // This is the H file of the class holding the code for
// processing all the IBOUtlets for the Login screen
.
.
.
_vicMain = [[vicLogin_iPad alloc] initWithNibName:@"vicMainScreen" bundle:nil];
请注意,我最初是声明 UIViewController 来初始化我的_vicMain,在使用顶部的弹出窗口后,我意识到两者都使用相同的 UIViewController。
由:
1) 包含您的类(子视图),以及执行上述_vicMain的同一模块(这是一个视图控制器对象/变量),即在我的情况下它是“vicLogin_iPad.h”,并且:
2)使用自定义构造函数声明对象(即,使用“ ”代替“ ”。xxx = [UIViewController alloc] ...
xxx = [vicLogin_iPad alloc] ...
问题已解决。
我希望这会有所帮助,因为从错误消息中查明缺乏细节是一件痛苦的事情......
问候 海德·萨蒂
我有完全相同的错误消息,感谢 (!!) http://www.idev101.com 我能够解决挑战的 Kira。我只是在谷歌搜索和堆叠所有这些线程后才找到她的网站。我现在在这里发帖,为下一个来到 StackOverFlow 的人发帖,并且遇到了与我相同的挑战,因为那个人很可能会通过 Google 来到这个线程。
我意识到,我错误地做了这个:
UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];
而不是这个:
DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];
哪里
DeviceViewController
我的班级的名字也被称为
DeviceViewController.h
DeviceViewController.m
你必须
"import DeviceViewController.h"
在实现(.m 文件)中,要调用另一个 UIViewController。
如果我只为像我这样的初学者陈述显而易见的事情,我绝对不会感到抱歉,并且可能会投票,因为这与问题并不完全相关,但我现在连续搜索了 4 (?!?) 小时以寻找这些错误消息的答案。如果我能把这个留给 1 或 2 个人,那就太好了:)
PS:对于那些对代码如何继续加载其他 UIViewController 感兴趣的人:
[self presentViewController:deviceViewController animated:YES completion:nil];
评论
我在处理我的 tableview 单元格时遇到了相同的错误日志。我发现我的 UILabels 将引用出口(您可以在引用检查器中查看)复制到文件的所有者和我的单元格的类。当我删除对文件所有者的引用时,事情会好起来。
只有在设备(iPhone)上调试时,我才会发生这种情况。iOS模拟器工作正常。 从Xcode进行“Product->Clean”似乎解决了这个问题,但我不知道为什么。
评论
我以另一种略有不同的形式遇到了同样的错误:
在界面构建器中,我有一个带有自定义子控制器的导航控制器。此类名称设置正确,但 NIB 名称(选择子控制器,转到属性检查器)设置为错误的文件(基本上是不同的目标之一)。将其重置为正确的文件名解决了该问题。
我也有这个问题。我已将带有 IBOutlet 的视图从一个 xib 文件复制到另一个 xib 文件。即使我删除了旧引用并创建了新引用,此错误仍然发生。
我最终重新启动了xcode来解决这个问题。
当我尝试为表实现自定义 ViewCell 时,我遇到了这个错误。当我突出显示 XIB 的视图控制器并连接到 CellView 中的元素时,一旦我删除了这些元素,就导致了错误“此类不符合键值编码”,它就摆脱了错误。
删除下图中的连接。
只需确保只有与表视图单元格的连接即可。要进行检查,请单击表视图单元格,然后在 INSPECTOR 中查找您的连接。
评论
File's Owner
UIView
我的修复类似于 Gerard Grundy 的修复。在使用 XIB 创建自定义 UITableViewCell 时,我错误地将自定义类名称应用于文件的 Owner,而不是 UITableViewCell。将该类应用于画布上的 UITableViewCell 并将我的 IBOutlet 属性连接到它解决了该问题。
评论
就我而言,
[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]
是原因。
将其替换为 initWithNibName,已解决。
就我而言,这是由于引用了错误的笔尖引起的:
BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
评论
就我而言,这是情节提要源代码中的错误,请按照下列步骤操作:
- 首先以源代码形式打开故事板
- 寻找
<connections>
- 删除不需要的连接
例如:
<connections>
<outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
<outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
<outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>
如您所见,这些是代码变量名称与情节提要布局 xml 标记之间的连接;)
我有同样的症状。根本原因是我的源文件的“目标成员资格”未设置为正确的目标。我认为这意味着我的类不会被构建并包含在我的应用程序中。
要更正它,请执行以下操作:
- 突出显示 .m 文件。
- 在右窗格中,选择“文件检查器”。
- 在“目标成员资格”部分下,确保选中相应的生成目标。
希望这对那里的某人有所帮助。
这个错误是另一回事!
这是我修复它的方法。我正在使用 xcode 版本 6.1.1 并使用 swift。每次我的应用程序尝试执行 segue 以跳转到下一个屏幕时,我都会收到此错误。这是我所做的。
- 检查按钮是否连接到正确的操作(这不是问题,但仍然很好检查)
- 检查该按钮是否没有您可能错误创建的任何其他操作或出口。(这不是问题,但仍然很好检查)
- 检查日志并确保“下一个屏幕”中的所有按钮都具有正确的操作,如果有任何 segue,请确保它们具有唯一标识符。(这就是问题所在)
- 其中一个 segue 没有唯一标识符
- 其中一个按钮有一个动作和两个出口,这是我错误地创建的。
- 删除任何其他网点,并确保进入下一个屏幕的顺序具有唯一标识符。
干杯
这已经发生在我身上两次了。
解决方案是重新制作整个故事板,因为我从另一个故事板复制了它(因为它几乎相同)
当视图控制器类中的两个变量引用 UI 标签或其他 UI 元素并且我删除其中一个变量时,也会发生这种情况。
查看其他答案,似乎有很多事情会导致此错误。这里还有一个。
如果你
- 具有自定义视图
- 添加了@IBInspectable属性
- 然后后来删除了它
然后,您可能还会收到类似于以下内容的错误
无法在 [您的自定义 View] ...:此类不符合键的键值编码 [xxx]。
解决方案是删除旧属性。
打开类的标识检查器,在“用户定义的运行时属性”下选择属性名称,然后按减号按钮 (-)。
评论
有时 swift 文件不会在目标中添加或删除,请转到 target-->Build 设置 -->编译源代码 -->查看是否缺少任何所需的 swift 类文件。 就我而言,由于编译中不存在 swift 源文件,应用程序崩溃了。
Identity Inspector 中 View Controller 的“Module”属性可能与预期不同。此外,请确保将新类添加到目标列表中。
评论
另一个棘手的案例:
在 IB 中,将 ViewController 添加到情节提要中,删除了其视图并将自定义类设置为“MyViewController”,以便从 MyViewController.xib 实例化视图
将 Storyboard ID 指定为相同的“MyViewController”会导致异常。
将 Storyboard ID 更改为其他名称可解决此问题。
升级到 xcode7 后,我在使用 swift 类时遇到了这个问题。通过使用 @objc 指令解决了它:
@objc(XXXViewController) 类 XXXViewController
就我而言。合并后,我在 xib 文件中没有丢失的插座。
Shift + Command + K
解决了我的问题。我清理了我的项目并重建了。
只是为了补充这一点,因为我也遇到了这个错误。浏览所有这些答案似乎最适用于使用 UI 和故事板的东西。我知道原始海报似乎确实在使用 UI,但是在搜索此错误的可能原因时,大多数问题都会回到这个问题,而其他问题则作为重复项关闭,或者只是在故事板中连接事物时遇到问题,所以我将添加我的解决方案。
我当时正在用 Swift 2 编写 Web 服务。我已经构建了所有需要的代理对象和存根。当我遍历返回的 XML 时,我正在动态实例化我的对象,这些对象都来自它们并在它们上使用。每次尝试设置属性时,它都会因此错误而爆炸。NSObject
setValue:forKey
setValue:forKey
对于我正在处理的每种类型(例如,,),我都有一个switch语句,对于我检查对象上的类型,然后将值转换为该类型并尝试将其设置为。Bool?
CShort?
String?
setValue:forKey
最终,我开始注释掉所有这些行,并发现我的 switch 语句案例确实适用于 .setValue:forKey
default
String?
我终于发现你不能使用可选的 swift 类型,除非它们直接映射到 Objective-C 类型,如 或 .我最终将所有类型更改为,因为它具有直接映射。因为就我而言,我只需使用并将其初始化为 .其他人可能没有那么奢侈。setValue:forKey
String?
NSNumber?
CShort?
NSNumber?
Bool?
Bool
false
无论如何,这真是一件令人头疼的事情,希望这能帮助到其他有类似问题的人,并不断被重定向到这个问题并对自己说,“我没有在UI中做任何事情!
所以最后,再重申一次,键值编码不适用于可选。下面我最终找到了某个地方,但我忘记了在哪里,所以无论谁发布了这个,我都道歉,如果我记得我在哪里找到这个,我会给予赞扬,但它救了我的命:
不能在 Optional Int 属性上使用 KVC,因为 KVC 是 Cocoa / Objective-C 和 Objective-C 看不到可选 Int - 它不是 桥接到 Objective-C。Objective-C 只能看到 桥接到 Objective-C:
派生自 NSObject 的类类型
使用 @objc 公开的类类型
桥接的 Swift 结构
评论
我有同样的问题。我的项目发生了这种情况,因为我更改了我的产品名称,但在接口构建器中,我的旧名称为 Module,这会导致崩溃,因此请务必检查所有 xib 模块名称是否已更改。
你可能有 UI 元素的出口,但没有 .h 文件中的 IBOutlet 属性 对于连接属性中的所有 UI 元素,请查看 outlets 及其 .h 头文件中
的相应属性。
.h 文件中可能缺少一个或多个属性条目。
以及您可以在其他答案中看到的其他问题。 我为自己创建这个错误的方式是,我从头开始一个项目,首先删除故事板的初始场景,然后将另一个项目中的场景粘贴到我的故事板中。
这样做没有问题。你只需要添加一个故事板的入口点,即检查你喜欢的视图控制器。否则,它将是一个灰色的场景,并给你抛出一个错误。is initial View Controller
“此类不符合键的键值编码” 我知道有点晚了,但我的答案不同,所以我认为它需要发布,我以错误的方式推动了第二个控制器,这是示例
推送控制器的错误方式
UIViewController* controller = [[UIViewController
alloc]initWithNibName:@"TempViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:true];
正确的方式
TempViewController* controller = [[TempViewController
alloc]initWithNibName:@"TempViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:true];
我没有找到任何像上面这样的答案,所以它可能可以帮助一些有同样问题的人
当我将 UIView 链接到故事板并连接 IBOutlet 时,我遇到了这种情况,例如:
@property (strong, nonatomic) IBOutlet UIView *someView
但后来,我将 UIView 变成了一个自定义类,但忘记更改上面定义的这个 IBOutlet 的类名。这是一个奇怪的错误,因为如果自定义视图没有子视图,它不会抱怨,但是一旦有子视图,它就会显示问题中陈述的错误,但显示在其中一个子视图上,而不是实际存在问题的外部 UIView。让我删除并重新添加所有子视图以试图找到问题,而实际上与子视图无关
当我使用主情节提要作为启动屏幕文件时,我遇到了同样的问题。我想如果您使用故事板作为启动屏幕文件,则不应将其连接到视图控制器,因为它尚未加载。
出于不同的原因,我遇到了同样的问题:我使用主情节提要作为启动屏幕文件。我想如果您使用故事板作为启动屏幕文件,则不应将其连接到视图控制器,因为它尚未加载。
这可能意味着您正在尝试使用开头没有签名的排序描述符。如:
[array valueForKeyPath:@"distinctUnionOfObjects.self"]
实际上必须是:
[array valueForKeyPath:@"@distinctUnionOfObjects.self"]
您可能需要删除插座,通过将 IB 绘制到 来重新创建它。H 文件。
如果您有一个自定义 UIViewController 子类,其中包含导致问题的 IBOutlets,我发现唯一可以真正消除错误的步骤是
.1 将类更改为 UIViewController
.2 断开所有插座(它们现在都有黄色警告三角形) - 只需断开有问题的插座就足够了。
.3 完成所有标准步骤 - ↑⌘K,删除派生数据(、祈祷垫、忧虑珠)
.4 启动应用程序 - 转到有问题的场景。
.5 终止应用程序,返回Interface Builder,将类更改回自定义类名。
.6 重新连接您的插座。
启动应用程序,这通常会解决键值合规性问题。
评论
您是否未连接选取器对象?
大声笑 54 个答案,没有一个是我的解决方案。谈谈一个常见的错误。
就我而言,这是因为我的 VC 上有一个选择器对象,并且没有为其设置出口和操作。
当我只是想看看布局的外观时,我经常让按钮等处于未连接状态。但似乎你不能为选择者做到这一点。
如果您尝试观察不存在的值,请注意。
这发生在我身上,只是当我观察文本字段的“Text”属性时,而我应该观察“text”属性。
我遇到麻烦的原因是我复制了一个故事板文件(如果我没记错的话,在 Xcode 之外),然后复制文件中的所有视图控制器都具有与原始文件中相同的对象 ID。补救措施是复制粘贴视图控制器,然后它们将获得新的对象 ID。您可以在 Identity Inspector 中查看对象 ID。
我遇到了同样的问题,原因是在Interface Builder中指定了一个模块(而不是将其留空)。因此,当我使用与我设置的模块不同的模块时,应用程序会崩溃:S ...希望这对其他人有所帮助,因为我的问题不是由于插座损坏或过时造成的!
确保在文件中添加自定义类(甚至为空)实现,如下所示:.m
@implementation MySubclass
@end
我在 ui 视图控制器的 storyboard 和 swift 类中遇到了这个问题。通过使用 @objc 指令解决了它:
@objc(MyViewController) class MyViewController
有时这与你的“从目标继承”有关,必须设置该值。对于单个目标应用程序,您只需选择“从 Target 继承”。如果有多个目标,请选择所需的目标。
评论
我的问题在我更改目标名称后开始。
我自己的自定义 UI 类将模块名称设置为旧目标名称。
我将目标名称更改为新名称,现在工作正常。
它可能来自这样一个事实,即您控制了拖动并创建了一个出口或操作,而忘记删除它。即使你删除了代码,或者即使你已经制作了足够的 cmd+Z,你也需要进入情节提要的连接检查器,看看你创建的动作或出口是否还在这里。
评论
就我而言,我已将 ViewController 添加到情节提要中,但我没有在设计器中为其分配情节提要 ID。一旦我给了它一个 ID,它就起作用了。
使用 Xamarin/Visual Studio 2015。
就我而言,ViewController.m 中 IBOutlet 的属性名称已更改,但 Storyboard 中的属性名称未更改。通过按住 ctrl 键拖动将 IBOutlet 重新引入 ViewController.m 解决了该问题。我还注意到在 XCode 中找到这种“孤儿”IBOutlet 的方法:(看图)那些不是“孤儿”的 IBOutlet 有同心圆而不是行号。
我通过做两件事解决了这个问题:
- 修复了视图的类引用:
- 重新导入所有网点:
当我从笔尖手动加载视图时,我遇到了同样的错误。原来我忘了设置视图的所有者。
例如,如果您按以下方式加载视图,
let view = Bundle.main.loadNibNamed("MyNibFileName",
owner: nil,
options: nil)?.first as! UIView
然后添加一个 IBOutlet,则无法引用 IBOutlet,应用程序将崩溃并出现上述错误。
修复:为视图分配所有者。
let view = Bundle.main.loadNibNamed("MyNibFileName",
owner: self,
options: nil)?.first as! UIView
我真是愚蠢的错误。所以我决定在这里分享,希望这能帮助到其他像我这样的人。
我的项目中还有另一个子模块,我命名了一个与主模块中另一个类同名的新类,我的新类没有 xib 文件(100% 通过代码),但主模块中的另一个类有 xib 文件。我认为 Xcode 将新类与主模块中的 xib 文件链接错误。
消息崩溃的原因:
this class is not key value coding-compliant for the key tableView.
我遇到了这个错误,该错误发生在我为表视图原型单元创建的自定义类中的所有插座上。所有输出都已正确连接到情节提要,并且 Class 字段在原型单元的标识检查器中正确命名。
删除并重新创建插座不起作用。清理构建不起作用。最终起作用的是将情节提要标识检查器中的类更改为默认的 UITableViewCell,按 Enter,然后将其更改回我的自定义类的名称。出于某种原因,这奏效了。
为了添加到这个史诗般的传奇中......
我的视图控制器上面有一个属性: @objc(TheNameOfMyViewController)
这使得所有插座都崩溃,每个插座都出现“不符合键值”错误。这只是IOS12及以下版本的问题。它在 iOS 13 上运行良好。
删除该修饰符解决了此问题。现在所有的网点都工作正常。
我也有这个问题,这是由于通过创建一个新的出口来重命名视图。情节提要中可能有旧的连接插座。
您需要做的是从情节提要中删除旧的出口。
- 转到情节提要。
- 单击“显示代码审查”按钮(上面有 <- -> 标志的按钮,就在显示/隐藏导航器的左侧)。
- 搜索“connections”标签。
- 在“connections”标记中查找“outlet”标记,并将“property”属性设置为您在 Exception 中获得的名称。
- 取下该插座标签。
- 点击“Command + B”,尽情享受吧!
就我而言,是指定了错误的.只需删除名称并检查即可。module
target
module
Inherit Module from target
我正在使用 Xamarin.IOS 创建自定义笔尖。最后,我找到了根本原因,转到 Xcode 并选择了 nib 文件,在 Interface Builder 中,选择 UIView 类并选择 Connections Inspector 并删除默认插座,如下所示。
我从字面上尝试了这个线程中的每个选项。唯一能为我解决它的是更改我的自定义视图 xib 文件的名称。
我的自定义视图和 xib 具有相同的名称。重命名 xib 修复了它。
NSUnknownKeyException 错误
'NSUnknownKeyException', reason: this class is not key value coding-compliant for the key
当文件(例如TableViewCell.xib)与单元格类(例如TableViewCell.swift)同名时,我遇到了此错误.xib
正确的方法是:
TableViewCell.swift -> View.swift <-> View.xib
对我来说,我必须单击文件的 Owner 对象并导航到连接并删除有问题的连接
iOS 运行时错误
线程 1:“[ setValue:forUndefinedKey:]:此类不符合键 xxx 的键值编码。
在以下情况下,可能会收到此错误:
- .xib + UITableViewHeaderFooterView
当您使用 where show 页眉/页脚扩展并连接文件和UITableView
UITableViewHeaderFooterView
.swift
- 设置
File's Owner
正确方法:
- 改为设置为
Custom Class
containerView
- 在 .xib 中查看网点。其中一些可以通过 Xcode 使用黄色解释标记进行标记。在这种情况下,只需重新设置它
通过单击按钮删除按钮引用,然后重新创建对此按钮的引用。
正如@FranticRock提到的,这个线程确实是一个史诗般的传奇。
就我而言——
- 插座连接正确
- “Inherit From Target”具有适当的值,这意味着模块已正确添加
在我的情况下,导致崩溃的原因在User Defined Runtime Attributes
Identity Inspector
我有一个视图,它以某种方式具有三个属性 borderColor、borderWidth 和 cornerRadius
从该视图中删除这些属性解决了该问题。
就我而言,我愚蠢地将我的 UIViewController 的访问修饰符更改为 Private,当然它无法访问它......
在我的例子中,视图是 UIView,但 XIB 连接是 LottieAnimationView 类型的 IBOutlet。实际的 lottie 是 UIView 的子项。
评论