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

时间:2014-07-24 04:09:35

标签: ios xcode xcode6 interface-builder uistoryboard

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

  

Interface Builder文件中的未知类X。

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

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

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

52 个答案:

答案 0 :(得分:1376)

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

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

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

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

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

这是一张让事情更清晰的图片: enter image description here

答案 1 :(得分:97)

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

答案 2 :(得分:71)

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

@objc(ForumTopicListViewController) class ForumTopicListViewController

答案 3 :(得分:56)

这对我有用..

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

enter image description here

答案 4 :(得分:53)

具有多个目标的项目

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

enter image description here

答案 5 :(得分:44)

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

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

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

答案 6 :(得分:32)

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

答案 7 :(得分:28)

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

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

基础设施:XCode8,Swift3

enter image description here

答案 8 :(得分:16)

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

这是:

enter image description here

答案 9 :(得分: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中错过了多少小时

答案 10 :(得分:13)

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

一般情况下,请查找您的控件并从控件实体中删除customModulecustomModuleProvider

为我做了一招。

答案 11 :(得分:9)

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

答案 12 :(得分:9)

我遇到了同样的问题。

在我的情况下,Xcode没有将我的自定义类添加到:Target&gt;构建阶段&gt;编译来源。

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

enter image description here

我希望这会对你有所帮助。

答案 13 :(得分:9)

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

我通过删除Launch Screen File

中的Main InterfaceInfo.plist条目来解决此问题

答案 14 :(得分:8)

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

答案 15 :(得分:7)

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

答案 16 :(得分:7)

这些步骤对我有用。

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

答案 17 :(得分:6)

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

Interface Builder文件中的未知类 xxx

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

答案 18 :(得分:6)

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

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

答案 19 :(得分:6)

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

另请查看this answer,它似乎可以解决“真实”问题。我遇到的问题。

答案 20 :(得分:4)

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

enter image description here

答案 21 :(得分:4)

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

enter image description here

答案 22 :(得分:4)

就我而言,我在项目设置中为-ObjC添加了一个标记Other Linker Flags,以使其正常工作。我也尝试使用-all_load标志,它也运行良好。

enter image description here

答案 23 :(得分:3)

在我的情况下,Storyboard / xib中引用的没有设置目标成员资格

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

No target membership set.

答案 24 :(得分:2)

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

答案 25 :(得分:2)

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

答案 26 :(得分:2)

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

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

转到View-&gt; Utilities-&gt; Show File Inspector (这将显示右侧的文件检查器,带有.m文件信息)

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

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

答案 27 :(得分:1)

我的问题是用户错误。我的故事板中有一个通用的UIView,在Identity Inspector的Custom Class部分,我不小心将名字从UIView更改为乱码。

所有需要修复的是将其更改回UIView。

答案 28 :(得分:1)

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

希望这有帮助!

答案 29 :(得分:1)

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

答案 30 :(得分:1)

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

答案 31 :(得分:1)

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

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

答案 32 :(得分:1)

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

Sooo,xib文件如下所示:

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

在我看来可怕的解决方案,但据说苹果希望我们现在这样做。

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

答案 33 :(得分:0)

Swift 3 解决方案。

所有这些都不起作用。

  1. 点击右侧窗格中的Module无效。
  2. 添加@obj无效。
  3. 重新启动无效。
  4. 移动到桌面,因为xcode中断较长的路径不起作用。 ...
  5. 这终于奏效了。

    只需在其中创建新目录并创建新项目。添加Main.sotryboard以外的文件。

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

    瞧!瞧!这很有效。

答案 34 :(得分:0)

对我来说,我已经尝试过解决此问题中的所有解决方案,但最终我还是做到了。

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

然后我回到情节提要中,该课程是UICountingLabel,我将其删除并按Enter (空无类),然后我再次添加它并按Enter键,工作成功。

答案 35 :(得分:0)

发生在我身上的原因是我的项目以“ä,ü,ö”命名

答案 36 :(得分:0)

我是PyObjC用户,并且在自己的文件中拥有NSView子类。对我来说,解决此问题的方法是将NSView子类从其自己的文件移动到我的AppController.py文件中。这是其中包含应用程序控制器的文件。

答案 37 :(得分:0)

XCode 10停止“优化调试”时,这真的很奇怪。
就我而言,我用Storyboard设置了UITableViewDelegate和UITableViewDataSource,却忘记了实现那些必需的方法。
我只想先测试视图,然后再实现这些方法,然后崩溃! XCode 9会警告这些方法,但是XCode 10确实使我的代码变慢,而不是在此代码上,其他代码使我陷入了“错误怀疑”。
希望这对某人有所帮助。< br />谢谢

答案 38 :(得分:0)

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

答案 39 :(得分:0)

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

我们已经从XIB覆盖并将图像发布到故事板上,而我还没有完成再次启动屏幕的工作。当我最终创建一个没有自定义视图控制器的裸骨启动故事板(不允许)时,这些控制台错误就不再出现了。

答案 40 :(得分:0)

我的问题与podfile框架有关(特别是&#39; BWWalkthrough&#39;)。上述解决方案都不适用于我,无论我怎么做,我都无法让模块指向我的应用程序。

最终为我工作的是将库作为podfile删除,并将其作为静态库直接添加到我的项目中。在那之后,对我来说,一切都很尴尬。不完全确定什么是“破碎”&#39;使用该类的pod实现。

答案 41 :(得分:0)

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

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

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

然后我意识到我还没有将navigationController连接到详细信息页面。因此,如果您正在推送具有自定义ID的新ViewController,最好检查一下。

答案 42 :(得分:0)

当我将文件添加到&#34; myapp&#34;时,我遇到了与Xcode 6.3相同的问题。 那是因为我选择&#34;创建文件夹参考&#34;而不是&#34;创建组&#34;。我删除这些文件并使用&#34;创建组&#34;再次添加它们。选项。问题已解决。

答案 43 :(得分:0)

在我的情况下,我将应用程序设置为通用应用程序,因此xcode创建了两个故事板。但我只使用(设计)了iPhone故事板。并试图在iPad中运行应用程序。解决问题只需要使应用程序只为iPhone和工作得很好。

答案 44 :(得分:0)

我在玩Spring课程。这个错误发生在我身上,因为我在将整个文件夹类移动到项目而不是创建组时使用了文件夹作为参考。所以这是我的解决方案,不要使用文件夹作为参考,而是创建组。

答案 45 :(得分:0)

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

答案 46 :(得分:0)

没有其他时,这对我有用。从终端的项目目录:

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

在Xcode中将匹配的文件作为源代码打开,并将ViewController的任何实例更改为您实际需要的内容。在我的例子中,我需要打开的文件是Main.storyboard,我将ViewController的实例更改为DetailViewController。

我从Xcode和main.storyboard中删除了两个文件,我认为这是我开始使用这个问题。

答案 47 :(得分:0)

我遇到了同样的问题,但修复程度不一样。

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

当它打开时,转到你的界面构建器项目,你会看到他识别你的脚本,然后你确实点击你的脚本名称并按回车键,你会看到模块输入将自行填充。

它会像魅力一样工作! :d

答案 48 :(得分:0)

它发生在我身上,因为我的班级标有@objc,在故事板中可以找到模块。删除@objc修复了问题

答案 49 :(得分:0)

当我创建一个与我的项目目录中已经存在的名称相同的项目时,我遇到了一个问题(虽然它已经被删除了一段时间)。我在那里写了我的解决方案https://stackoverflow.com/a/27763697/1654692

答案 50 :(得分:0)

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

答案 51 :(得分:0)

当我删除已经包含的ViewController.h&amp;时,我在Xcode 6上遇到了这样的问题。来自我的基于视图的新项目的ViewController.m文件,并从storyboard中删除了与此类相关的场景,Xcode将这些文件兑现在派生数据文件夹中,因此如果您尝试转到Window - &gt;项目 - &gt; your_project并删除派生数据一切都会顺利。