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

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

接口构建器文件中的未知类X。

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

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

编辑:我还想补充说,我尝试了清洁,重置模拟器,搞乱构建阶段等。这些都没用。

229901 次浏览

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

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

然后选择这些对象,打开标识检查器,在“自定义类”下;您应该看到Module选项。最后:

  • 单击Module文本框内的,并按enter。
  • (2022年更新),选中“Inherit Module From target”;选择。

就是这样!我的所有自定义对象的当前模块一定是在Xcode 6 beta 4中内部设置不正确。但在检查员那里并没有看到这一点。

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

下面是一张图片,让事情更清楚: enter image description here

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

再看看这个答案,它似乎解决了我遇到的“真正的”问题。

只对我有效的是将模块名称添加到xib文件中…

因此,xib文件看起来是这样的:

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

在我看来,这是一个可怕的解决方案,但这应该是苹果现在想让我们做的。

# EYZ0……显然,苹果在这种情况下并没有提供太多帮助,因为他们称之为“按预期工作”。

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

@objc(ForumTopicListViewController) class ForumTopicListViewController

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

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

我有这个问题后,我添加了一个新目标,然后创建了一个新类使用“新文件”对话框,但意外地未能检查新目标以及在创建对话框中的原始目标,所以对象只添加到我的原始目标。解决方案是删除源文件(仅删除引用),然后使用“添加文件”将它们添加回来,这次检查两个目标。

在Xcode 6中,当我删除已经包含的ViewController.h &ViewController。m文件从我的新基于视图的项目,并删除场景,这是与这个类从storyboard, Xcode兑现这些文件在派生数据文件夹,所以如果你尝试去窗口->项目-> your_project,并删除派生数据一切都会好起来。

不要在项目名称中使用空格,否则自定义类将无法找到您自己的类。

有时候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">

有时您提供的控制器会从当前应用程序中丢失其目标成员。在这种情况下,在“Module”字段上按enter键将不起任何作用。转到控制器,确保它已将目标成员设置为当前应用程序。

当我在我的项目目录中创建一个已经存在的同名项目时,我遇到了一个问题(尽管它在一段时间前被删除了)。我把解写在这里https://stackoverflow.com/a/27763697/1654692

这发生在我身上,因为我的类被标记为@objc,在sotryboard中找不到模块。删除@objc修复了这个问题

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

我通过从Info.plist中删除Launch Screen FileMain Interface条目来修复它

当我将故事板从Swift项目移植到Objective-c项目时,我遇到了这个问题,注意到vvkuznetsov的回答,原来两个项目使用相同的标识符。我输入Product -> Clean,在模块和类文本框中点击Enter键。这个问题消失了。

我也遇到了同样的问题,但解决方法不同。

项目文件夹有点损坏,所以我不得不复制我的项目文件夹到另一个文件夹,例如你的桌面,然后打开项目。

当它打开转到你的接口构建器项目,你会看到他识别你的脚本,然后你点击你的脚本名称并按enter,你会看到模块输入将填充它自己。

它会像魔法一样起作用!: D

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

希望这能有所帮助!

这对我很有效。

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

enter image description here

没有什么对我有用。从终端的工程目录:

[~/Developer/MyProject] grep -rn ViewController * | grep -i xib

在Xcode中打开匹配的文件作为源代码,并根据实际需要更改ViewController的任何实例。在我的例子中,我需要作为源代码打开的文件是Main。storyboard和我把ViewController的实例改为DetailViewController。

我从Xcode和main中删除了两个文件。故事板,我认为这是导致我这个问题开始。

在mij情况下,ViewController.h/m在库中。项目仍然构建,但自Xcode 6.3以来,上述错误在运行时显示。将两个文件移回项目中解决了这个问题。

我和春季班一起玩。这个错误发生在我身上,因为我在移动整个文件夹类到项目时使用文件夹作为参考,而不是创建组。所以这是我的解决方案,不使用文件夹作为参考,但创建组。

我通过做与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中浪费了多少时间

在我的例子中,故事板/ xib中引用的没有设置目标会员

为了解决这个问题,给这个类的.h.m文件与其他类相同的目标成员。

No target membership set.

我通过在所有视图控制器和视图的标识检查器的自定义类中输入模块名称(不幸的是下拉列表将什么都不显示…)解决了这个问题。

您可能还需要指明目标提供程序。为了达到这个目标,你可以在源代码模式中打开故事板,并在ViewController和View尖括号中添加“customModuleProvider”属性。

在我的例子中,我将app设置为universal app,所以xcode创建了两个故事板。但我只使用(设计)iPhone故事板。并尝试在iPad上运行应用程序。为了解决问题,只需要为iPhone制作应用程序,并且工作出色。

我搜遍了所有地方。没有一个答案对我有用,直到我遇到一个人,他让我把我的项目文件夹移动到桌面。它是自动工作的。显然,如果你的项目文件夹在很多文件夹中,XCODE会崩溃。

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

我在Xcode 6.3中添加文件到“myapp”时遇到了同样的问题。 这是因为我选择了“创建文件夹引用”而不是“创建组”。我删除了这些文件,并使用“create groups”选项再次添加它们。

这些步骤对我很有用。

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

选择你未知的类文件,打开文件检查器选项卡,在Target Membership中检查你的目标名称。好了。

我解决了这个问题,打开我的故事板文件作为源代码,并使用命令f搜索我的未知类,并删除与之相关的自定义类。

我沿着劳拉建议的路线修复了这个问题,但我不需要重新创建文件。

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

Go to View->Utilities->Show File Inspector (这将显示文件检查器在右边,带有.m-file信息)

打开Target Membership部分,并确保为这个.m文件选择了目标

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

这可以在任何6.0以上的Xcode中发生。在Swift项目中重命名一些ViewController类后,我就遇到了这种情况(但我猜Obj-C也会发生这种情况)。你只需要打开接口构建器,转到重命名了类的ViewController的身份检查器,选择class并按Enter。这将重命名类重新分配给选定的ViewController,也重置模块值在重命名类后丢失。

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

Xcode 8.1崩溃了。简单和恼人的只是崩溃,不打印任何东西。我追了一个小时的幻影崩溃,只是为了发现它是同一件事——IB中未分配的类。如果你得到了一些幻影崩溃,首先仔细检查IB中未分配的类。

对我来说,我使用的是Xcode7 + Swift2

通过检查我的代码解决了这个问题,我在我的viewController中有这一行:

 self?.navigationController?.pushViewController(vc, animated: true)

然后我意识到我还没有将navigationController连接到细节页。如果你推送一个带有自定义ID的新ViewController,最好检查一下。

我也有同样的问题。

在我的例子中,Xcode没有将我的自定义类添加到:Target > Build Phase > Compile Sources。

所以我建议你验证一下你的CustomClass。M在这里。

enter image description here

我希望这对你有所帮助。

我的问题与podfile框架(特别是“BWWalkthrough”)有关。以上的解决方案都不适合我,无论我如何尝试,我都无法让模块指向我的应用程序。

最终对我有用的是将库作为podfile删除,并将其作为静态库直接添加到我的项目中。从那以后一切都很好。不完全确定类的pod实现有什么“坏”。

在我的案例中,问题是由于将我们的主故事板设置为启动屏幕,并且在应用程序启动时,对于故事板中引用的每个自定义视图控制器,我都会得到一个控制台错误(没有崩溃)。

我们已经讨论了从xib和启动图像到故事板,我还没有抽出时间让启动屏幕重新工作。当我终于开始创建一个没有自定义视图控制器(这是不允许的)的骨架启动故事板时,这些控制台错误就不再出现了。

对我来说,问题是我在故事板中引用了一个自定义类(与.h文件匹配),但在.m文件中没有@implementation命令。

检查你的类是否有正确的目标会员

我在Xcode 8中遇到了这个问题,为了解决这个问题,我不得不在文本编辑器中修改故事板。

一般来说,查找控件并从控件实体中删除customModulecustomModuleProvider

为我做了一个魔术。

# EYZ0解决方案。

所有这些都不起作用。

  1. 点击右边面板上的Module无效。
  2. 添加@obj无效。
  3. 重新启动不起作用。
  4. 移动到桌面作为xcode中断较长的路径是不工作的。 李…< / >

这终于奏效了。

在里面放创建新目录并创建新项目。添加除Main.sotryboard之外的其他文件。

现在复制前一个项目中的视图控制器,并将其粘贴到新的Main.storyboard中。

瞧!这个作品。

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

接口构建器文件中的未知类xxx < em > < / em >

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

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

这个解决方案适用于具体案例:用于圆荚体(或迦太基)框架中的自定义的观点类。

基础设施:XCode8, Swift3

enter image description here

在我的例子中,我在项目设置中添加了-ObjCOther Linker Flags标志,以使其工作。我还尝试了-all_load标志,它工作得很好。

enter image description here

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

下面就是:

enter image description here

多目标项目

在我的情况下,我正在与多个目标的项目工作,问题是“从目标继承”是未经检查的。选择“从目标继承”解决了我的问题

enter image description here

我的问题是用户错误。我在我的故事板中有一个通用的UIView,在身份检查器的自定义类部分,我不小心把UIView的名字改成了胡话。

只需要把它改回UIView。

我是一个PyObjC用户,我在自己的文件中有我的NSView子类。为我解决这个问题的方法是将NSView子类从它自己的文件移动到我的AppController.py文件中。这是包含应用程序控制器的文件。

XCode 10停止“细化调试”时,这真的很奇怪 在我的情况下,我设置了UITableViewDelegate和UITableViewDataSource与Storyboard和忘记实现那些必要的方法。我只是想先测试视图,在实现这些方法之前,然后崩溃!XCode 9,将警告这些方法,但XCode 10,真的使我的代码慢,不是在这一个,其他人我已经通过这个“错误怀疑”。希望这能帮助到某人。< br > < / p >感谢

对我来说,它发生了,因为我的项目被称为“ä,ü,ö”

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

enter image description here

您需要选中“从目标继承模块”复选框

enter image description here

对我来说,这个问题我已经试过了所有的解决方法,但都没有成功。

将pod .h .m文件复制到我的项目中,并将.h导入到项目c头文件中。

然后我回到故事板类是UICountingLabel我删除它,并按enter (空无类),然后我再次添加它并按enter键,工作成功