这是什么意思? “'NSUnknownKeyException',原因:...此类不是键值X的键值编码兼容”

时间:2010-06-21 19:57:32

标签: ios macos cocoa cocoa-touch interface-builder

我正在尝试将UILabel与我班级中创建的IBOutlet相关联。

我的应用程序崩溃,出现以下错误。这是什么意思?我该如何解决?

  

***由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[< UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:此类与密钥XXX不符合密钥值编码。'

70 个答案:

答案 0 :(得分:1477)

您的xib中可能连接不良。

我多次犯过这个错误。虽然在这种情况下TechZen的答案绝对正确,但另一个常见原因是当您更改.h / .m中的IBOutlet属性的名称时,您已经连接到笔尖中的文件所有者

来自你的笔尖:

  1. 在IB中选择对象,然后转到“Connections Inspector”。
  2. 在“引用Outlets”下,确保您的对象仍未连接到旧属性名称...如果是,点击小“x”删除引用并再次建立。

    example 1

  3. 如果你使用Storyboard是另一个常见原因,你的UIButton可能有多个分配(解决方案几乎与nib相同):

    1. 打开故事板并右键单击UIButton
    2. 您会看到此按钮有多个assign / ref。 使用小“x”删除其中一个“Main ...”灰色窗口:

      example 2

答案 1 :(得分:908)

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

我下载了你的项目。

您收到的错误是

  

'NSUnknownKeyException',原因:'[< UIViewController 0x3927310> setValue:forUndefinedKey:]:此类不是密钥字符串的密钥值编码。'

这是由Second中的MainWindow.xib视图控制器导致类别为 UIViewController而不是SecondView 。更改为正确的类可以解决问题。

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

此错误的另一个可能原因:复制时&将元素从一个控制器粘贴到另一个控制器,Xcode以某种方式保持与原始控制器的链接,即使在编辑和将此元素重新链接到新控制器中。

此错误的另一个可能原因:

Bad Outlet。

您已在.h文件中删除重命名出口名称。

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

答案 2 :(得分:110)

我不得不从模拟器/ iPhone中删除该应用以消除此错误。

答案 3 :(得分:100)

当我尝试为表实现自定义ViewCell时出现此错误。当我为XIB突出显示View控制器并连接到CellView中的元素时,导致错误“此类不是键值的关键值编码 - ”一旦我删除了它,它就摆脱了错误。

删除下图中的连接。 Delete the connections in inspector when File Owner is highlighted

确保您只与表视图单元格建立连接。要检查单击表格视图单元格并在INSPECTOR中查找您的连接。

The connection should be in here when Table View Cell is highlighted

答案 4 :(得分:81)

有时这与你的"继承目标"必须设置该值。使用单个目标应用程序,您只需选择继承自目标。如果您有多个目标,请选择所需目标。

enter image description here

答案 5 :(得分:64)

如果它是仅限iPhone的应用程序,而不是通用应用程序,请确保以下字段为空:

目标>摘要> iPhone / iPod部署信息>主界面

如果你指定了一个xib,它会崩溃。

答案 6 :(得分:41)

我遇到了同样的问题,虽然TechZen的回答可能确实令人惊讶但我发现很难适用于我的情况。

最终,我通过对象(在下图中突出显示)下列出的控制器链接标签,而不是通过文件所有者来解决问题。

希望这会有所帮助。

enter image description here

答案 7 :(得分:35)

在我的情况下,故事板源代码中出现错误,请按照以下步骤操作:

  1. 首先打开你的故事板作为源代码
  2. 搜索<connections>
  3. 删除不需要的连接
  4. 例如:

    <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标签;)

答案 8 :(得分:32)

enter image description here enter image description here

我的修复与Gerard Grundy相似。在使用XIB创建自定义UITableViewCell时,我错误地将自定义类名称应用于文件所有者而不是UITableViewCell。将类应用到画布上的UITableViewCell并将我的IBOutlet属性连接到它解决了这个问题。

答案 9 :(得分:30)

  1. 您只需指定IBOutlet一次,IBOutlet标签就不需要您的ivar。
  2. 您是否使用UIViewController实例化您的NIB?在某些时候,您应该致电[SecondView initWithNibName:@"yourNibName" bundle:nil];

答案 10 :(得分:30)

只有在设备(iPhone)上进行调试时才会发生这种情况。 iOS模拟器工作正常。从Xcode做“Product-&gt; Clean”似乎解决了这个问题,但我不明白为什么。

答案 11 :(得分:22)

我从http://www.idev101.com向Kira提供了完全相同的错误消息并感谢(!!)我能够解决这个挑战。我在google搜索和堆叠所有这些线程后才找到她的网站。我现在正在这里发布下一个StackOverFlow并且遇到同样的挑战,因为那个人很可能会通过谷歌来到这个主题。

我意识到,我错误地做了这个:

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];

答案 12 :(得分:20)

查看其他答案,似乎有很多事情可能导致此错误。还有一个。

如果你

  • 有自定义视图
  • 添加了@IBInspectable属性
  • 然后删除它

然后您可能会收到与

类似的错误
  

无法在[您的自定义设置]上设置(xxx)用户定义的检查属性   查看] ...:此类不是密钥值编码兼容的密钥   [XXX]。

解决方法是删除旧属性。

enter image description here

打开您的类的Identity检查器,在User Defined Runtime Attributes下选择属性名称,然后按减号按钮( - )。

答案 13 :(得分:15)

当我的视图控制器最初有一个.xib文件时,会发生这种情况,但现在是以编程方式创建的。

即使我已从此项目中删除.xib文件。用户iPhone / iPad可能包含此viewcontroller的.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];
}

答案 14 :(得分:10)

对于有两个目标的项目(使用自己的MainWindow XIB),我遇到了类似的问题。导致此错误的根本问题是UIViewController类未包含在第二个项目的资源列表中。即接口构建器允许我在MainWindow.xib中指定它,但在运行时系统无法找到该类。

即。 cmd-单击相关的UIViewController类,并仔细检查它是否包含在“目标”选项卡中。

答案 15 :(得分:8)

可能是从您重命名或删除的Xib界面引用组件的情况。重新引用对我有用。

答案 16 :(得分:8)

我刚刚在我的重复项目中遇到了这个问题,并通过检查2个地方来解决:

1-确保列表中包含.m文件 - &gt;项目 - 建设阶段 - 编译来源
2-之后,转到界面构建器(可能这只是IB发生的错误)并取消链接所有属性,标签,图像等...然后重新链接所有。我已经意识到我删除了一个属性,但它仍然在IB中链接。

希望它适用于某些人。

答案 17 :(得分:8)

只是添加到此,因为我也收到了这个错误。通过所有这些答案,大多数似乎适用于使用UI和故事板的东西。我知道原始海报似乎确实与UI一起工作但是当搜索这个错误的可能原因时,大多数问题都会回到这个问题,其他人被关闭作为重复或只是在故事板中连接事情的问题所以我会添加我的解决方案。

我正在编写Swift 2中的Web服务编码。我已经构建了所有需要的代理对象和存根。当我浏览返回的XML时,我动态地实例化了我的对象,这些对象都来自NSObject并且使用setValue:forKey。每次setValue:forKey尝试设置属性时,都会出现此错误。

我为我正在处理的每种类型都有一个switch语句(例如Bool?CShort?String?),对于我经历的每个XML节点,检查了类型是什么对象然后将值转换为该类型并尝试使用setValue:forKey设置它。

最后,我开始评论所有这些setValue:forKey行,发现我的default切换语句案例适用于String?

我终于发现你不能使用setValue:forKey的可选swift类型,除非它们直接映射到Objective-C类型,如String?或{{ 1}}。我最终将所有NSNumber?类型更改为CShort?,因为它具有直接映射。对于NSNumber?,在我的情况下,我可以使用Bool?并将其初始化为Bool。其他人可能没那么奢侈。

无论如何,令人头疼的是希望这会帮助其他有类似问题的人,并不断重定向到这个问题并对自己说:“我在UI中没有做任何事情!”。

最后再重申一次键值编码不适用于选项。下面我最终找到了某个地方,但是我忘记了发布这个的人在哪里,我道歉并且如果我记得我发现这个但是它挽救了我的生命会给予赞扬:

  

你不能在Optional Int属性上使用KVC,因为KVC是Cocoa /   Objective-C和Objective-C看不到可选的Int - 它不是   桥接到Objective-C。 Objective-C只能看到类型   桥接到Objective-C:

     

从NSObject派生的类类型

     

使用@objc

公开的类类型      

桥接的Swift结构

答案 18 :(得分:7)

我发现的另一个“不合规”的问题是,由于某种原因我设法获得了两个类的副本。

我正在为错误的副本添加密钥。 Interface Builder仍然看到了密钥并让我与它们挂钩,但在运行时它使用的是没有新密钥的类的另一个副本。

要找到哪个是“正确的”副本,我使用XCode的cmd点击其他地方的类名,跳转到正确的副本,然后我杀掉了未使用的副本(在从未使用的副本中删除我的编辑后)第一)。

故事的道德:重复的类文件很糟糕。

答案 19 :(得分:7)

此错误是另一回事!

以下是我如何修复它。我正在使用xcode Version 6.1.1并使用swift。每当我的应用程序尝试执行segue跳转到下一个屏幕时,我都会收到此错误。这就是我做的。

  1. 检查按钮是否连接到正确的操作。(这不是问题,但仍然很好检查)
  2. 检查按钮是否没有您可能错误创建的任何其他操作或插座。 (这不是问题,但仍然很好检查)
  3. 检查日志并确保NEXT SCREEN中的所有按钮都有正确的操作,如果有任何segues,请确保它们具有唯一标识符。 (这是问题)
    • 其中一个segue没有唯一标识符
    • 其中一个按钮有一个动作和两个我错误创建的插座。
    • 删除所有其他插座,并确保您到下一个屏幕的segues具有唯一标识符。
  4. 干杯,

答案 20 :(得分:7)

&#34;该类不是密钥值编码兼容的密钥&#34; 我知道它有点晚了,但我的回答是不同的所以我认为它需要发布,我是以错误的方式推动第二个控制器,这是样本

推送控制器的错误方法

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];

我没有找到像上面那样的答案,所以可能会帮助一个人有同样的问题

答案 21 :(得分:6)

如果你有一个带有IBOutlets的自定义UIViewController子类导致出现问题,那么我发现实际摆脱错误的唯一一组步骤是

.1将类更改为UIViewController

.2断开所有插座(它们现在都有黄色警告三角形) - 仅断开有问题的插座可能就足够了。

.3执行所有标准步骤 - ↑⌘K,删除派生数据(,祈祷垫,担心珠子)

.4启动应用程序 - 转到有问题的场景。

.5杀死应用程序,返回Interface Builder,将类更改回自定义类名。

.6重新连接插座。

启动应用&amp;这通常会清除键值合规性问题。

答案 22 :(得分:6)

我有同样的症状。根本原因是我的源文件的“目标成员资格”未设置为正确的目标。我认为这意味着我的课程不会被构建并包含在我的应用程序中。

要纠正它:

  1. 突出显示.m文件。
  2. 在右侧窗格中,选择“文件检查器”。
  3. 在“目标成员资格”部分下,确保选中相应的构建目标。
  4. 希望这有助于那里的人。

答案 23 :(得分:5)

就我而言。合并后我没有在xib文件中丢失插座。

  

Shift + Command + K

解决了我的问题。我清理了我的项目并重建了。

答案 24 :(得分:4)

在我的情况下,这是由引用错误的Nib引起的:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];

答案 25 :(得分:3)

我在故事板上遇到了这个错误。上面的解决方案似乎不是问题所以我最终删除了视图控制器并重新添加它(当然重新连接segue并重新分配类)修复了它。我不知道它到底是什么,但是我在这个开始之前不久重命名了相关的视图控制器类,所以也许这已经有了一些东西。

答案 26 :(得分:3)

你可能有UI元素的出口而不是.h文件中的IBOutlet属性

对于连接属性检查出口中的所有UI元素及其在.h头中的相应属性文件。

可能缺少.h文件中的一个或多个属性条目。

答案 27 :(得分:3)

我遇到了同样的问题。我在XIB文件中创建了一个tableviewCell,并且遇到了这种错误。我的问题是我将“文件所有者”类定义为我的单元格视图控制器。我刚把它取出来并设置了单元格的类(在xib文件上单击单元格的边框,转到右侧面板上的第三个选项卡,并说它选择了视图控制器)。

同时尝试清理代码。

答案 28 :(得分:3)

我遇到了同样的问题。我确实重置了模拟器。删除和添加按钮控件。最后弄得很干净:)感谢堆栈溢出。一些我的代码如何变得正常并开始工作。

答案 29 :(得分:2)

我有同样的问题。这发生在我的项目中,因为我更改了我的产品名称,但在界面构建器中我将旧名称作为模块,这导致崩溃所以一定要检查所有xib模块名称是否也已更改或不。

答案 30 :(得分:2)

您可能需要删除插座,通过将表格IB绘制到.H文件来重新创建插座。

答案 31 :(得分:2)

当视图控制器类中的两个变量引用UI标签或其他UI元素并删除其中一个变量时,我也会发生这种情况。

答案 32 :(得分:2)

我从头文件中删除了该属性。我找不到任何引用,但调试错误仍然引用它。我发现nib文件仍然有引用它。我删除了引用它的块,一切都已修复。

在Project Navigator中,

找到Nib(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>

答案 33 :(得分:2)

通过在Storyboard / xib界面中选择违规对象并打开Connections Inspector(View-&gt; Utilities-&gt; Show Connections Inspector),检查是否有杂散引用插座。如果你确实删除了不需要的连接,那么你应该好好去。

答案 34 :(得分:1)

我通过做两件事解决了这个问题:

  1. 该视图的固定类参考:

  1. 重新导入所有奥特莱斯:

答案 35 :(得分:1)

我在故事板和swi类中遇到了ui视图控制器这个问题。使用@objc指令解决了它:

@objc(MyViewController) class MyViewController

答案 36 :(得分:1)

我遇到了同样的问题,原因是由于在Interface Builder中指定了一个模块(而不是将其留空)。因此,当我使用与我设置的模块不同的模块时,应用程序会崩溃:S ...希望这可以帮助其他人,因为我的问题不是由于断开或过时的插座!

答案 37 :(得分:1)

在我的情况下,ViewController.m中的IBOutlet属性名称已更改,但Storyboard中的属性名称未更改。按ctrl-drag将IBOutlet重新引入ViewController.m解决了这个问题。我也注意到了找到这样的&#34; orphane&#34; XCode中的IBOutlets :(看图像)那些不是&#34;孤立的&#34;有同心圆而不是行号。

"Orphaned" IBOutlets don't have concentric circles in the line number column.

答案 38 :(得分:1)

提出了同样的问题。我的解决方案是将正确的故事板值放入主故事板下拉列表中。我已重命名为mainstoryboard.storyboard,但未重置部署信息。

答案 39 :(得分:1)

这种情况的另一个原因是您声明此属性实现为@dynamic,但类无法在父类中找到它。

答案 40 :(得分:1)

这可能意味着你在尝试使用排序描述符而没有开头的atsign。如:

[array valueForKeyPath:@"distinctUnionOfObjects.self"]

实际上必须是:

[array valueForKeyPath:@"@distinctUnionOfObjects.self"]

答案 41 :(得分:1)

我遇到了同样的问题,原因不同:我使用主故事板作为启动屏幕文件。我想如果您使用故事板作为启动屏幕文件,它不应该连接到视图控制器,因为它还没有被加载。

答案 42 :(得分:1)

当我使用主故事板作为启动屏幕文件时,我遇到了同样的问题。我想如果你使用故事板作为启动屏幕文件,它不应该连接到视图控制器,因为它还没有被加载。

答案 43 :(得分:1)

当我将UIView链接到故事板并连接IBOutlet时,我发生了这种情况:

@property (strong, nonatomic) IBOutlet UIView *someView

但是稍后,我将UIView变成了一个自定义类,但忘了更改上面定义的这个IBOutlet的类名。这是一个奇怪的错误,因为如果自定义视图没有子视图就不会抱怨,但是只要有子视图就会显示问题中所述的错误,但是在其中一个子视图上,而不是问题实际存在的外部UIView。让我删除并读取试图找到问题的所有子视图,而实际上与子视图无关

答案 44 :(得分:1)

您可以在其他答案中看到其他问题。 我为自己创建这个错误的方式是我从头开始创建一个项目,然后删除我的故事板的初始场景,然后将另一个项目中的场景粘贴到我的故事板中。

这样做没有问题。您只需要添加故事板的入口点,即检查您喜欢的is initial View Controller视图控制器。否则它将是一个灰色场景,并给你一个错误。

enter image description here

答案 45 :(得分:1)

升级到xcode7后,我遇到了swift类的问题。使用@objc指令解决了它:

@objc(XXXViewController)类XXXViewController

答案 46 :(得分:1)

我遇到了这个错误,该错误发生在为表视图原型单元创建的自定义类的所有插座上。所有出口均正确连接到情节提要,并且在身份检查器中为原型单元正确命名了“类别”字段。

删除和重新创建网点无效。清理版本无效。最终可行的方法是将故事板身份检查器中的Class更改为默认的UITableViewCell,单击Enter,然后将其更改回我的自定义类的名称。由于某种原因,这行得通。

答案 47 :(得分:1)

这已经发生在我身上两次了。

解决方案是重新制作整个故事板,因为我从另一个故事板复制了它(因为它几乎相同)

答案 48 :(得分:1)

就我而言,

[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]

是原因。

将此替换为 initWithNibName ,已解决。

答案 49 :(得分:0)

我正在使用 Xamarin.IOS 创建自定义笔尖。最后我找到了根本原因,转到 Xcode 并选择 nib 文件,在 Interface Builder 中,选择 UIView 类并选择 Connections Inspector 并删除默认插座,如下所示。enter image description here

答案 50 :(得分:0)

当我从笔尖手动加载视图时,出现了相同的错误。原来,我忘记了设置视图的所有者。

例如如果您通过以下方式加载视图,

 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

答案 51 :(得分:0)

我真是愚蠢的错误。因此,我决定在这里分享,希望这会对其他像我这样的人有所帮助。

我的项目中有另一个子模块,并且在主模块中命名了一个与其他类同名的新类,我的新类没有xib文件(按代码百分比为100%),但是主模块中的另一个类有xib文件。我认为Xcode将错误的新类与主模块中的xib文件链接在一起。

出现崩溃消息的原因:

this class is not key value coding-compliant for the key tableView.

答案 52 :(得分:0)

要添加到这个史诗般的传奇故事中...

我的视图控制器上面有一个属性: @objc(TheNameOfMyViewController)

这使所有Outlet崩溃,并且每个Outlet出现“不符合键值”错误。这仅是IOS12及以下版本的问题。在iOS 13上运行良好。

删除该修饰符可解决此问题。现在所有的网点都工作正常。

答案 53 :(得分:0)

我也遇到了这个问题,这是由于为视图创建了新的出口而重命名了视图。您的故事板中可能有旧的连接插座。

您需要做的是从情节提要中删除旧的插座。

  1. 转到情节提要。
  2. 点击“显示代码查看”按钮(位于显示/隐藏导航器左侧的<-->符号)。
  3. 搜索“连接”标签。
  4. 在“连接”标签中的“出口”标签中,将“属性”属性设置为您在异常中获得的名称。
  5. 删除该出口标签。
  6. 点击“ Command + B”,尽情享受吧!

答案 54 :(得分:0)

在我的情况下,将findPreference指定给错误的module。只需删除target名称并检查module就可以了。

enter image description here

答案 55 :(得分:0)

在我的情况下,我在故事板中添加了一个ViewController,但我没有在设计器中为它分配一个Storyboard ID。一旦我给它一个ID,它就有用了。

使用Xamarin / Visual Studio 2015。

答案 56 :(得分:0)

我更改了目标名称后,我的问题就开始了。

我自己的自定义UI类将模块名称设置为旧目标名称。

我将目标名称更改为新名称,现在工作正常。

答案 57 :(得分:0)

通常当我遇到这种情况时,@ TechZen的答案就可以了。然而,昨天,我花了很长时间捣乱故事板连接才发现问题出现在我的代码中。

我有一个自定义视图控制器,可以在我的故事板中处理各种布局,但其中一个布局需要一个其他人不使用的特殊标签。所以我创建了一个类似的子类:

@interface MyViewControllerSubclass : MyViewController

然后我在MyViewControllerSubclass.m中添加了一个私有属性:

@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UILabel *crashesApp;
@end

Xcode很高兴地允许我连接这个IBOutlet,但每次加载视图时,应用程序都会崩溃,因为旧的&#34;不符合键值&#39; chrashesApp&#39;&#34;#34 ;

回想起来,这个半明显的解决方案是将私有类别更改为使用正确的名称,即子类的名称:

@interface MyViewControllerSubclass ()
@property (weak, nonatomic) IBOutlet UILabel *noMoreCrashing;
@end

答案 58 :(得分:0)

确保添加自定义类&#39; .m文件中的(甚至是空的)实现,如:

@implementation MySubclass
@end

答案 59 :(得分:0)

我遇到麻烦的原因是我复制了一个故事板文件(如果我没记错的话,在Xcode之外),然后复制文件中的所有视图控制器都具有与原始文件中相同的对象ID。解决方法是复制粘贴视图控制器,然后它们将获得一个新的对象ID。您可以在Identity Inspector中看到对象ID。

答案 60 :(得分:0)

如果你想要观察一个不存在的值,请注意。

这种情况发生在我身上,因为我正在观察文本字段的“Text”属性,而当我本来应该观察“text”属性时。

答案 61 :(得分:0)

您是否未将选择器对象保持未连接状态?

大声笑了54回答,而不是其中一个是我的解决方案。谈论一个常见的错误。

在我的情况下,这是因为我的VC上有一个选择器对象,并没有为它设置插座和操作。

当我只是想看看布局看起来如何时,我常常将按钮等保持不连接状态。但似乎你不能为选择器做这件事。

答案 62 :(得分:0)

如果要在Interface Builder中的单独XIB文件中设计小型子视图,并且在IB中将其设置为与父视图相同的类,也会发生此问题。

如果你然后这样显示:

UIViewController *vc = [[UIViewController alloc] initWithNibName:@"NameOfTheSubviewNibFile" bundle:nil];
[self.view addSubview:vc.view];

将显示该视图,但如果已将IBOutlets连接到其文件所有者,则会收到错误消息。所以,这应该工作:

  1. 在父视图的代码中,声明IBOutlet UIView *mySubview以引用子视图的nib文件中的视图
  2. 在子视图的nib文件中,将文件所有者连接到视图,并将其设置为mySubview
  3. 通过以下方式展示:
  4. [[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]
    [self.view addSubview:mySubview];
    

    你会没事的!

答案 63 :(得分:0)

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

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

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

答案 64 :(得分:0)

我记得过去有过类似的问题,我通过改变这句话解决了这个问题:

_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] ...”。

问题得到解决。

我希望这有助于确定错误消息中缺少详细信息是一种痛苦......

此致 Heider Sati

答案 65 :(得分:0)

另一个棘手的案例:

在IB中将ViewController添加到storyboard,删除了它的视图并将Custom Class设置为&#34; MyViewController&#34;所以视图是从MyViewController.xib

实例化的

指定Storyboard ID相同&#34; MyViewController&#34;导致例外。

将故事板ID更改为某个不同的名称可以解决问题。

答案 66 :(得分:0)

有时swift文件不会从目标中添加或删除,转到目标 - &gt;构建设置 - &gt;编译来源 - &gt;看看是否缺少任何所需的swift类文件。 在我的情况下,由于编译中不存在swift源文件,应用程序崩溃了。

答案 67 :(得分:0)

在处理我的tableview单元格时遇到相同的错误日志。我发现我的UILabel有重复的引用插座(你可以在参考检查器中查看)给文件的所有者和我的单元格的类。当我删除对文件所有者的引用时,情况会好转。

答案 68 :(得分:0)

我在另一种略有不同的形式中遇到了同样的错误:

在界面构建器中,我有一个带有自定义子控件的导航控制器。正确设置了它的类名,但是NIB名称(选择子控制器,转到属性检查器)被设置为错误的文件(基本上是一个不同的目标)。将其重置为正确的文件名解决了这个问题。

答案 69 :(得分:0)

我也有这个问题。我已经将IBOutlet的视图从一个xib文件复制到另一个xib文件。即使我删除了旧引用并创建了一个新引用,但仍然会出现此错误。

我最终重新启动xcode来解决这个问题。