这个类不符合键值编码的要求,无法对authView进行编码。

11

当我在模拟器上运行我的应用程序时,它能够正常运行,但是当我尝试在设备上运行时,它无法工作并出现以下错误:

注意:我在我的代码中找不到任何类型为 authView 的类

2011-02-24 12:04:14.472 TestP[473:307] *** Terminating app due to uncaught exception     'NSUnknownKeyException', reason: '[<TestP 0x19d2b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key authView.'
*** Call stack at first throw:
(
0   CoreFoundation                      0x33ac0987 __exceptionPreprocess + 114
1   libobjc.A.dylib                     0x3347b49d objc_exception_throw + 24
2   CoreFoundation                      0x33ac0705 -[NSException dealloc] + 0
3   Foundation                          0x3367db4f -[NSObject(NSKeyValueCoding)    setValue:forUndefinedKey:] + 182
4   Foundation                          0x3367d03b _NSSetUsingKeyValueSetter + 90
5   Foundation                          0x3367eda3 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 194
6   Foundation                          0x33630b17 -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 130
7   UIKit                               0x3224c60f -[UIRuntimeOutletConnection connect] + 66
8   CoreFoundation                      0x33a63fc7 -[NSObject(NSObject) performSelector:] + 18
9   CoreFoundation                      0x33a6cd51 -[NSArray makeObjectsPerformSelector:] + 388
10  UIKit                               0x3224b577 -[UINib instantiateWithOwner:options:] + 586
11  UIKit                               0x3224cb39 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 92
12  UIKit                               0x3209e871 -[UIApplication _loadMainNibFile] + 96
13  UIKit                               0x3209a1fd -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 180
14  UIKit                               0x3206648b -[UIApplication handleEvent:withNewEvent:] + 1114
15  UIKit                               0x32065ec9 -[UIApplication sendEvent:] + 44
16  UIKit                               0x32065907 _UIApplicationHandleEvent + 5090
17  GraphicsServices                    0x33b0ef03 PurpleEventCallback + 666
18  CoreFoundation                      0x33a556ff __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26
19  CoreFoundation                      0x33a556c3 __CFRunLoopDoSource1 + 166
20  CoreFoundation                      0x33a47f7d __CFRunLoopRun + 520
21  CoreFoundation                      0x33a47c87 CFRunLoopRunSpecific + 230
22  CoreFoundation                      0x33a47b8f CFRunLoopRunInMode + 58
23  UIKit                               0x32099309 -[UIApplication _run] + 380
24  UIKit                               0x32096e93 UIApplicationMain + 670
25  TestP                               0x00002213 main + 98
26  TestP                               0x000021ac start + 40
)
terminate called after throwing an instance of 'NSException'

你的代码中哪里抛出了这个异常?你在 objc_exception_throw 中设置了断点吗? - Simon Goldeen
抱歉,我在objc_exception_throw中该在哪里设置断点?我很菜。 - Robert Bed
这个视频有一个关于如何设置断点的教程。它非常方便,我建议你去做! - Simon Goldeen
10个回答

16

你可能在xib文件中搞错了"File's Owner"。这个异常是在nib解档期间抛出的(通过回溯中的+[UINib...]可以证明)。它正试图连接您定义的IBOutlets

您的其中一个视图被设置为File's Owner的authView。然而,在解档nib时,所有者没有authView属性,因此解档失败。


我在所有的xib文件中搜索了authView引用,但是没有找到,还有其他建议吗? - Robert Bed
@Robert Bedwell,你可以找出无法解档的xib文件并从那里开始查找。(虽然由于回溯包括对“_loadMainNibFile”的引用,它很可能是你的MainWindow.xib文件) - Dave DeLong
我来晚了,我猜问题还是存在的。 - Waqas Raja
我还删除了MainWindow.xib,但仍然出现相同的错误,我查找了所有的xib文件,结果还是出现了相同的错误... - Robert Bed
4
请检查您的连接检视器(inspector)选项卡,找出引发错误的视图。可能会有一些标有感叹号的插座(outlets)列在那里。移除这些插座(outlets),所有东西都应该可以运作了。我认为问题只是变量名被更改和重新连接了。但是旧的变量名对应的nib/storyboard文件连接仍然存在。 - daveomcd

11

@Dave DeLong指出了正确的问题。

解决方法

  • 找出异常抛出的时间,即正在加载哪个viewController。
  • 然后检查该viewController的nib文件,其中必须有一个在xib中附加的IBOutlet,但可能在viewController.h文件中被省略或者xib文件中缺失一些附加控件。

为什么在模拟器上运行?有时会导致混乱。

只需执行以下步骤

  1. Build -> Clean
  2. Build -> Clean All Targets

现在它运行真实代码,问题可能也已在设备上得到解决,或者如果确实存在问题,则模拟器也可能开始抛出异常。 (我已经提到了解决方法)


1
清理构建,问题解决了。 - bluehallu
清理构建,对我也起作用了。非常奇怪。 - Paul de Lange
对我来说,它在设备上开始工作了,但现在在模拟器上抛出了一个异常。 - ichanduu
1
我必须从模拟器中删除该应用程序,然后才会失去IBOutlet连接。 - Gal

6
这是我解决这个问题的方法。我进入我的“故事板”文件并选择了引起问题的视图。然后我点击连接检查器选项卡,你会看到右侧带有感叹号的连接而不是实心圆圈。删除这些连接,如果需要进行调整。保存>运行你的应用程序,它应该可以正常工作。希望这能帮到你 :)

5

我认为导致该异常的可能原因之一是,当你在故事板连接已经完成后更改了某个IBOutlet变量的名称时。因此,故事板中的UI元素仍然引用旧的变量名称。我通过检查故事板的XML表示(右键单击.storyboard文件并将其作为源代码打开),并删除旧的(不需要的)IBOutlet变量名称来解决了这个问题。

例如,假设您在故事板上有一个UITextField,并有相应的属性:

@property (retain, nonatomic) IBOutlet UItextField *myTextField;

您需要将Storyboard中的UI元素连接到该属性,然后决定以某种方式重命名变量。现在,如果您在Storyboard中右键单击UITextField,您会发现存在两个引用输出 - 旧的和新的。您可以通过在Connections Inspector中点击“x”符号或编辑Storyboard文件的XML变体来删除旧的引用输出。


4

在 Xcode 4 中,我遇到了一些引用问题。因为我声明了 IBOutlet 引用 authView,然后运行它,它就能工作了!后来我删除了 IBOutlet 声明,它也能正常工作。


2
我认为问题出在当你在视图类文件中更改变量名称并重新连接控件时,旧的连接仍然被引用在StoryBoard(或nib文件)中该视图的连接检查器中。因此,您必须在连接检查器中删除这些连接。有关更多详细信息,请参见我的答案... :) - daveomcd

3

我刚刚清理了项目并从设备中删除了应用,然后它又可以工作了。错误是引用了一个我已经删除的视图。


2

您可能已经创建了一个IBOutlet,然后将其删除,然后链接了一个新的IBOutlet,但在xib“检查器”中忘记删除链接,现在有一个重复的IBOutlet引用,编译器无法找到。


2
似乎你的Interface Builder没有正常工作。 如之前建议的那样,尝试清理和重建。如果仍然不起作用,我建议你重新创建你的xib界面。在类似的情况下,这对我有用。

2
我发现这些错误大多在您连接属性、编辑它们并再次连接时出现。请分析您的连接检查器以查找从先前创建和销毁的连接中保留下来的意外值。

2
在我的情况下,情况更加诡异。我有一个与已完全删除的XIB相关联的VC,转而只使用代码。在模拟器上运行得很好,但在设备上会系统性地崩溃。
所以我进行了清理、重建、关闭XCode,去吃点心并对着Mac大喊。然而编译器仍然指向一个不存在的XIB上的一个不存在的按钮。
尝试通过更改类名来解决问题,这样做起作用了!

将类和xib文件的名称以及xib中相应的目标名称更改对我有用。 - Abhishek Biswas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接