Xcode 6错误:Interface Builder文件中的未知类


600

我已升级到Xcode 6 beta 4,现在我的应用程序不断崩溃,并显示以下消息:

Interface Builder文件中的未知类X。

它崩溃是因为据称Xcode找不到我在Storyboard中链接的自定义类,但是它表明它们在Xcode界面中已正确链接。

我很肯定所有内容都正确链接。我唯一的其他选择可能是删除整个故事板文件,并从头开始,因为它可能以某种方式损坏。

编辑:我还想补充一点,我尝试清理,重置模拟器,弄乱构建阶段等。这些都不起作用。



1
@ImreKelényi你是对的。在做完您刚刚描述的事情后,最近又发生了这种情况。
史诗字节

这对我
有用

对我来说这是错别字,将其调试为Control元素,直到出现它,然后选择;查看控制器>身份检查器>自定义类>类。如果未定义该类,则删除该类。
特立独行的人2015年

9
请注意!这种“错误”可能源于不同的来源。如果接受的答案对您不起作用,则向下移动并尝试下一个答案。我的情况的正确答案是第五答案。
杰克森克尔

Answers:


1454

我在输入问题时解决了这个问题。我想我会回答我的问题,并留给其他任何在使用Xcode 6 beta 4时可能遇到此问题的人使用。

若要解决此问题,您需要在Storyboard中选择每个自定义类对象(这包括任何自定义视图,甚至包括自定义视图控制器本身)。

然后,选择那些对象,打开身份检查器,然后在“自定义类”下看到“模块”选项。在“模块”文本框内单击,然后按Enter。

而已!我所有自定义对象的当前模块必须在Xcode 6 beta 4中在内部进行了不正确的设置,但是在检查器中没有直观的指示。

请注意,如果在“模块”文本框内按Enter键无效,请尝试选择右侧的箭头并手动选择当前模块,然后清除文本框并按Enter键。您也可以尝试在课程文本框内按Enter键(尽管这通常是为了解决其他问题)。

这是使情况更清晰的图像: enter image description here


70
对于我来说,单击“模块”内部并按Enter并不能始终如一地工作,但是选择“类”字段(然后按Enter)始终可以完成工作。
ImreKelényi2014年

2
对我而言,目标设置正确,但该课程仍未出现在IB中。但是,我注意到文件的“位置”显示的是路径“相对于项目”而不是“相对于组”。删除文件引用和组,然后将其重新添加到项目根目录对我来说很有效。
knl 2014年

8
哇。谢谢你,我认为否则我不会到达那里的。这解决了在我添加@objc(...)到我的Swift类之一后开始发生的问题。
ndbroadbent

12
XCode 7.2中仍然存在此问题。此解决方案有效。
汤姆·

3
这仍然是Xcode 8.3.1中的一个问题……真可惜
Sepehr Behroozi

99

有时Xcode错过了 customModule="AppName" customModuleProvider="target"

要修复此问题,请打开情节提要作为源代码并替换以下行:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">

对此:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
 customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">

7
实际上,就我而言,我必须删除customModuleProvider,然后错误消失了。
Maciej Swic

3
Guillermo,截至3月底仍在Xcode中发生!
Ed Manners 2015年

3
@MaciejSwic customModuleProvider也为我删除了它,谢谢!
Sakiboy

1
XIB文件呢?
SleepsOnNewspapers 2015年

7
还在发生……是这样的事情让我想哭了:(
路加福音

72

重命名快速班后,我遇到了这个问题。通过使用@objc指令解决了它:

@objc(ForumTopicListViewController) class ForumTopicListViewController

4
这对我来说是固定的,我已经@objc class X开始@objc(X) class X工作了。
2014年

1
你也可以尝试删除您的派生数据看stackoverflow.com/questions/24039932/...
user1760527

从Single View项目模板重命名默认的ViewController类后,出现了此问题。我不知道使用了什么魔术,因此@objc()“原始” ViewController类不需要该指令……
Berend Klein Haneveld 2014年

我走到另一侧。我已经在Storyboard文件中指定了模块名称,但还添加了@objc指令。
WeZZard 2015年

1
没有为我工作。:(既不是模块名的工作的解决方案。
mythicalcoder

64

具有多个目标的项目

就我而言,我正在与多个目标一起工作的项目,问题是“从目标继承”未选中。选择“从目标继承”解决了我的问题

在此处输入图片说明


感谢您发布此信息。解决了我很快看到的问题。
JaredH '18

我也有类似情况。(XCode 9.4.1)我创建了一个名为FilesTestA的iOS应用,带有一个名为MxFileView的自定义UIView(由MxFileView.swift和MxFileView.xib组成)。然后,我添加了另一个目标:Today小部件(“ FilesTestAWidget”)。在窗口小部件中使用MxFileView的解决方案:(1)class =“ MxFileView”; (2)检查“从目标继承模块”(或取消选中它并手动输入“ FilesTestAWidget”);(3)在应用程序目标中,确保MxFileView.swift和MxFileView.xib都在其Target Membership中包含FilesTestAWidget。
Kenster999 '18

这是我在Xcode 10.1中的默认模板(一个iOS应用程序目标和两个测试目标)的新项目中发生的。对于我所有的自定义视图控制器,都未选中该复选框(因此,占位符文本为“ None”)。在检查并检查情节提要中每个自定义视图控制器的复选框后,问题已解决。
梅森

58

这对我有用。

检查您的编译源代码,是否添加了该文件(例如ViewController.m),在我的情况下未添加ViewController文件,因此出现了错误。

在此处输入图片说明


@CarmenA您只能将“ .m”文件添加到中Compile Sources。对于某些人来说,这确实是正确的解决方案。
Jacksonkr '16

我没有运气就尝试了其他几种解决方案。这成功了。出于某种奇怪的原因,一个目标缺少了一个适合我的源文件。
galactikuh

对我来说也是..因为某些解决冲突而发生
Eldhose

46

在6.0以上的任何Xcode中都可能发生这种情况。在Swift项目中重命名了一些ViewController类之后,这件事发生了(但是我想它也会在Obj-C中发生)。您只需要打开接口构建器,转到已将其类重命名的ViewController的Identity Inspector,选择类并按Enter。这会将重命名的类重新分配给选定的ViewController,还重置重命名该类后丢失的模块值。

Xcode 8.1的更新(可能也是8.0):

Xcode 8.1崩溃了。简单而烦人的只是崩溃,什么都不打印。我追赶那个幻影崩溃了一个小时,只是发现那是同一件事-IB中未分配的类。如果遇到幻像崩溃,请首先仔细检查IB是否有未分配的类。


谢谢你 看来,按照您的建议,Xcode将模块(在IB中的类下)从“无”更新为“当前”。我在想问题是,仅输入名称w / out按回车键就无法通过Xcode触发模块更新。
rockiesGrizzly '16

这对我有用。我无意中重命名了一个控制器类,因此在加载视图控制器时,该类显然不再存在。
Litehouse

32

有时,您提供的控制器将从当前应用程序中失去其目标成员资格。在这种情况下,在“模块”(Module)字段上按Enter键将无效。转到控制器,并确保已将目标成员资格设置为当前应用程序。


这也是我的问题-多个目标导致类文件意外地不包含在我正在构建的目标中。
Ryan Kreager

我合并了文件,却错过了我的目标之一,很好的答案
本杰明·希门尼斯

好了,合并pbx打破了目标成员资格值。
系统

32

启用使用Inherit Module From Target了正确的目标模块。那解决了问题。

在此处输入图片说明


确认。这帮助我解决了问题。
Chris8447

当我将视图控制器从Objective-C转换为Swift时,通常会遇到这个问题。我重新输入最后一个字母,然后按Enter。应该也可以。
DevNebulae

30

我的答案:设置自定义模块等于自定义Pod名称(在我的示例中为自定义类名称),如所附屏幕截图所示

该解决方案针对特定情况:适用于Pod(或Carthage)框架的自定义视图类。

基础架构:XCode8,Swift3

在此处输入图片说明


18

我通过与ChikabuZ建议的相反的方式解决了问题(尽管感谢指出)。在情节提要文件中,找到以下内容:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">

并替换为:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" sceneMemberID="viewController">

我不敢相信我会失去几个小时来解决Swift编译器和Xcode 6中的错误


17

选择合适Module的我Custom Class解决了这个问题。

这里是 :

在此处输入图片说明


13

我在Xcode 8中遇到了这个问题,要解决该问题,我不得不在文本编辑器中修改情节提要。

通常,查找控件customModulecustomModuleProvider从控件实体中删除。

为我做了一个把戏。


哈哈!不错的技巧:)
Vexy

10

我有同样的问题。

就我而言,Xcode并未将我的自定义类添加到:目标>构建阶段>编译源代码。

因此,我建议您验证您的CustomClass.m是否存在。

在此处输入图片说明

我希望这可以帮助你。


这就是我发生的事,幸运的是我找到了出路!我是来这里回答的,但你是第一位的。谢谢!!!
加布里埃尔·皮法雷蒂

9

我在Xcode 6.1面对这个问题时,我删除Main.storyboardLaunchScreen.xib文件,默认ViewController从我的项目中的类。

我通过删除Launch Screen File和中的Main Interface条目来修复它Info.plist



8

我为此到处搜索。在遇到1个要求我将项目文件夹移动到桌面的家伙之前,所有答案都对我不起作用。它只是自动工作。显然,如果您将文件夹投影到许多文件夹中,则XCODE实际上会中断。


自从我以前在Xcode 6中遇到问题以来,我又在Xcode 7 beta 5中遇到了这个问题。这次,这种方法对我有用。
林书豪

1
在Visual Studio中,存在类似的问题。但是在那儿,我们收到一条清晰的警告消息,提示路径太长,无法添加或编辑内容。不知道它与XCODE是否相同,但是在那一集之后,我将所有项目都保留在文档或桌面中,再也没有这个问题。我什至给使用Xamarin Studio的人这个建议,它对他们也
有用

7

这些步骤对我有用。

1)清除衍生数据。
2)删除.h和.m文件
3)再次创建.h和.m文件


这也为我工作。我什至可以在不清除派生数据的情况下使它工作。
jaytrixz 2015年

这对我有用,非常感谢Arwin,但是我仍然不明白为什么它会引起这样的错误,因为我之前没有在课堂上或IB中进行任何修改
Kirtikumar A.15 / 11/12

7

通过打开故事板文件作为源代码并使用Command-F搜索未知类并删除与之关联的自定义类,我解决了这个问题。


6

@gfrs说的是正确的,您需要设置模块。但是我曾经遇到一个问题,我的班级没有在Class下拉列表中列出。最终,我删除了swift文件,重新启动了Xcode并重新创建了该文件。最终列出了该类,可以在Storyboard中使用。

也可以看看这个答案,它看起来像是解决了我遇到的“实际”问题。


删除并重新添加类文件对我有用。谢谢!
Nicolas Miari 2015年

6

我通过在身份检查器的“自定义类”中为所有View控制器和视图键入“模块名称”(不幸的是,下拉列表将不显示任何内容...)来解决此问题。

您可能还需要指出目标提供者。为了实现此目标,您可以在源代码模式下打开情节提要,然后在ViewController和View尖括号中添加“ customModuleProvider”属性。


6

我的解决方案(Xcode 8.1 Swift 3.0):

Interface Builder文件中的未知类xxx

打开StoryBoard作为源代码,然后搜索xxx。删除包含值xxx的属性。生成并运行。


WTF?这对我来说绝对必要,谢谢。我不得不删除customModule="" customModuleProvider=""
Dan Rosenstark

1
如果我们尝试将包含此类错误的应用程序发布到应用程序商店,则该应用程序会被无意拒绝。
ibrahimyilmaz

我不同意。我刚刚提交了一个构建,我必须以这种方式将其修改为TestFlight,并且可以进行Beta测试了……我们将在实际的应用商店上看到发生了什么,但这是IB错误IMO。谢谢!
Dan Rosenstark '17


3

就我而言,情节提要/ xib中引用的没有目标会员资格设置。

要解决此问题,请为该课程的类别.h.m文件提供与其他课程相同的目标会员资格。

未设置目标成员资格。


这是我的问题,但是在尝试各种解决方案时,我造成了Epic Byte的答案解决的问题。您必须在要构建的目标中具有源代码,但在IB中,还需要将视图控制器设置为当前目标的一部分。
SafeFastExpressive

目标成员身份也是我的问题,无处不在,但由于有了这个答案,我才得以解决。
Borzh


2

当我将情节提要从Swift项目移植到Objective-c项目时,我遇到了问题,注意到vvkuznetsov的答案,结果是两个项目使用相同的标识符。在“产品->清洁”中,点击“模块和类别”文本字段上的Enter键。问题解决了。


2

我按照劳拉的建议修复了此问题,但不需要重新创建文件。

使用XCode 4,在Project Navigator中,选择包含抱怨的类的.m文件。

转到查看->实用工具->显示文件检查器(这将在右侧显示文件检查器,并带有.m文件信息)

打开“目标成员身份”部分,并确保为此.m文件选择了目标

当我将.m文件添加到项目中时,由于某种原因它没有将其添加到默认目标中,这导致我得到您提到的错误。


2

我的问题是用户错误。我在情节提要中有一个通用的UIView,在Identity Inspector的“自定义类”部分中,我不小心将名称从UIView更改为乱码。

修复它所要做的就是将其更改回UIView。


我做了同样的事情,但是我不小心将“自定义视图控制器”名称添加到了ViewControllers根视图的“自定义类”部分。所以我一直在寻找为什么为什么在整个根视图中都找不到View Controller的原因。
TMin

1

实际上对我唯一起作用的是将模块名称添加到xib文件中...

如此,xib文件如下所示:

mymodule.MyViewController.xib (Module being the name of the proyect, usually)

我认为这是一个可怕的解决方案,但据说这就是苹果希望我们现在这样做的方式。

这个问题显示了Beta 4中3种可能的解决方法 ……据某些人称,在这种情况下,Apple并不是很有帮助,因为他们称其为“按预期工作”。


1

我在Xcode 6.1(6A1052d)中遇到了相同的问题。我认为如果您重命名了App / Xcode项目,就会出现问题。

我的解决方案是在接口构建器中手动添加模块名称。


1

添加新目标后,出现了这个问题,然后使用“新建文件”对话框创建了新类,但无意中无法在创建对话框中检查新目标以及原始目标,因此该对象仅添加到了原始目标。解决方案是删除源文件(仅删除参考),然后使用“添加文件”将其重新添加,这次检查两个目标。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.