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

问题描述 投票:569回答:50

我升级到Xcode 6 beta 4,现在我的应用程序不断崩溃

Interface Builder文件中的未知类X.

它崩溃了,因为据说Xcode找不到我在Storyboard中链接的自定义类,但它显示它们在Xcode界面中正确链接。

我很肯定一切都是正确的。我唯一的另一个选择可能是删除整个故事板文件并从头开始,因为它可能会以某种方式损坏。

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

ios xcode xcode6 interface-builder uistoryboard
50个回答
1393
投票

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

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

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

而已!我的所有自定义对象的当前模块必须在Xcode 6 beta 4中以某种方式在内部错误设置。但是在检查器中没有这种可视指示。

请注意,如果在“模块”文本框内按Enter键不起作用,请尝试选择右侧的箭头并手动选择当前模块,然后清除文本框并按Enter键。您也可以尝试在类文本框中按Enter键(尽管这通常是为了解决另一个问题)。

这是一个让事情变得更清晰的图像:


16
投票

我通过与ChikabuZ建议完全相反的方式修复它(感谢指出它)。在storyboard文件中,找到:

<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中错过了几个小时


13
投票

我在Xcode 8中遇到了这个问题,要解决它我必须在文本编辑器中修改storyboard。

通常,查找您的控件并从控件实体中删除customModulecustomModuleProvider

给我一招。


9
投票

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

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


9
投票

我有同样的问题。

就我而言,Xcode没有将我的自定义类添加到:Target> Build Phase> Compile Sources。

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

enter image description here

我希望这可以帮助你。


9
投票

检查您的班级是否有正确的目标会员资格


8
投票

我为此搜索到处都是谷歌。直到我遇到一位要求我将项目文件夹移动到桌面的人才,这些答案都不适合我。它只是自动工作。显然,如果您将项目文件夹放在很多文件夹中,XCODE实际上会中断。


7
投票

这些步骤对我有用。

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


7
投票

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


7
投票

启用Inherit Module From Target采用了正确的目标模块。这解决了这个问题。

enter image description here


6
投票

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

还看看this answer,它看起来像是解决了我遇到的“真实”问题。


98
投票

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

要修复它,请打开storyboard作为源代码并替换此行:

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

对此:

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

6
投票

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

您可能还需要指明目标提供商。要实现此目标,您可以在源代码模式下打开故事板,并在ViewController和View尖括号中添加“customModuleProvider”属性。


6
投票

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

Interface Builder文件中的未知类xxx。

打开StoryBoard作为源代码并搜索xxx。删除包含值xxx的属性。构建并运行。


4
投票

在我的情况下,我在项目设置中向-ObjC添加了一个标志Other Linker Flags以使其工作。我也试过-all_load旗,它也运作良好。

enter image description here


3
投票

在我的例子中,Storyboard / xib中引用的类没有设置Target Membership。

要修复,请为该类的.h.m文件提供与其他类相同的目标成员资格。


2
投票

当我将故事板从Swift项目移植到Objective-c项目时,我遇到了问题,注意到vvkuznetsov's answer,结果发现这两个项目使用相同的标识符。 I“Product - > Clean”,然后点击Module and Class文本字段中的Enter键。问题消失了。


2
投票

我的解决方案是从Custom类定义中删除@objc。


2
投票

我按照Laura建议的方式解决了这个问题,但我不需要重新创建文件。

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

转到View-> Utilities-> Show File Inspector(这将显示右侧的File Inspector,带有.m文件信息)

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

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


1
投票

实际上只对我有用的是将模块名称添加到xib文件中......

Sooo,xib文件如下所示:

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

在我看来,这是一个可怕的解决方案,但这应该是Apple希望我们现在这样做的方式。

This question shows 3 possible work arounds back in beta 4 ......显然苹果公司在这种情况下并不是很有帮助,因为他们称之为“按预期工作”。


1
投票

我对Xcode Version 6.1(6A1052d)也有同样的问题。我认为如果您重命名App / Xcode项目会出现问题。

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


1
投票

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


71
投票

重命名swift类后我遇到了这个问题。使用@objc指令解决了这个问题:

@objc(ForumTopicListViewController) class ForumTopicListViewController

1
投票

解决方案对我来说不同。您需要将类的.m添加到目标的构建阶段编译源。

希望这可以帮助!


56
投票

这对我有用..

检查你的编译源代码,是否添加了该文件(例如; ViewController.m),在我的情况下没有添加ViewController文件,所以它给了我错误..


53
投票

具有多个目标的项目

在我的情况下,我正在处理具有多个目标的项目,并且问题是“从Target继承”未被检查。选择“从目标继承”解决了我的问题

enter image description here


45
投票

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

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

Xcode 8.1只是崩溃了。简单而烦人地只是崩溃而且不打印任何东西。我正在追逐那个幻影崩溃一小时才发现这是同样的事情 - 在IB中未分配的课程。如果您遇到一些幻像崩溃,请首先仔细检查IB是否有未分配的类。


32
投票

有时您提供的控制器会从当前应用程序中丢失其目标成员资格。在这种情况下,按“模块”字段中的回车将不执行任何操作。转到控制器并确保它具有设置为当前应用程序的目标成员资格。


28
投票

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

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

基础设施:XCode8,Swift3

enter image description here


17
投票

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

这里是 :

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.