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

639

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

接口生成器文件中未知的类X。

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

我确信一切都链接正确。我的唯一选择可能是删除整个storyboard文件并从头开始,因为它可能以某种方式损坏了。

编辑:我还想补充一点,即我尝试过清理、重置模拟器、调整构建阶段等,但没有任何作用。


可能是 https://dev59.com/4nA75IYBdhLWcg3wOGLS 的重复问题。 - Bouke
1
@ImreKelényi 你说得对。我最近也遇到了同样的问题,就是你刚才描述的那个问题。 - Epic Byte
这对我有用,https://dev59.com/z3I-5IYBdhLWcg3wsKl4 - vrunoa
对我来说这是个打字错误,调试到控制元素,直到它出现,选择; 视图控制器 > 身份检查器 > 自定义类 > 类。如果该类未定义,则删除它。 - mavericks
10
请注意!这个“错误”可能来自不同的原因。如果接受的答案对您无效,请向下滑动并尝试下一个答案。对于我的情况而言,正确的答案是第五个答案。 - Jacksonkr
如果你和我一样是因为TextFieldEffects库(https://github.com/raulriera/TextFieldEffects/tree/1.1.1)而来到这里的,请注意,这解决了我的问题。 - rigdonmr
52个回答

1511

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

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

然后,在选择这些对象的同时,打开身份检查器,在“Custom Class”下面,您应该看到Module选项。最后:

  • 单击模块文本框内部,然后按Enter键。
  • 或者 (更新于2022年),勾选“从目标继承模块”选项。

就这样!我所有自定义对象的当前模块在Xcode 6 beta 4中可能被错误地设置了。但是,在检查器中没有任何视觉指示。

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

以下是一张图片,以使事情更加清晰:

输入图像描述

71
对我而言,点击“模块”并按回车键并不总是有效,但选择“类别”字段(然后按回车键)总是可以完成任务。 - Imre Kelényi
8
哇,谢谢你,如果没有你,我不认为我能达到这个状态。在我的 Swift 类中添加了@objc(...)后,修复了开始发生的问题。请问需要翻译其他内容吗? - ndbroadbent
13
这个问题在 XCode 7.2 中仍然存在。这个解决方案有效。 - Tom Fast
3
在Xcode 8.3.1中仍存在这个问题...真是太遗憾了。 - Sepehr Behroozi
2
Xcode版本9.0 beta 6,问题仍未解决。 - Rafael Bugajewski
显示剩余38条评论

102
有时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仍然发生在Xcode中! - Ed Manners
3
@MaciejSwic 删除 customModuleProvider 对我也起到了作用,谢谢! - Sakiboy
1
那xib文件呢? - SleepsOnNewspapers
7
仍在发生... 这种事情让我想哭 :( - Luke
显示剩余7条评论

73

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

@objc(ForumTopicListViewController) class ForumTopicListViewController

4
这对我有帮助,我原本是用@objc class X的方式,改成@objc(X) class X后就可以了。 - Joe
1
你也可以尝试删除派生数据,参见https://dev59.com/hGAg5IYBdhLWcg3wBXOs - user1760527
这对我有用。ObjC/Swift混合项目。在Swift中创建了新的VC + Xib。Xib无法工作。VC是空白的。添加了这个,现在可以工作了。 - John
在Xcode 8的混合项目中,我的第一个Swift类已经起作用了。我已经使用了@objc,但是需要按照描述将其变为@objc(ClassName) class ClassName。 - Oded
1
对我没有用。:( 模块名称的解决方案也不起作用。 - mythicalcoder
显示剩余4条评论

70

拥有多个目标的项目

在我的情况下,我正在处理一个拥有多个目标的项目,问题在于 "继承自目标" 的复选框未被选中。选择 "继承自目标" 解决了我的问题。

输入图像描述


感谢您发布这篇文章。非常快速地解决了我遇到的问题。 - JaredH
我曾经遇到过类似的情况。(XCode 9.4.1)我创建了一个名为FilesTestA的iOS应用程序,其中包含一个自定义UIView,名为MxFileView(由MxFileView.swift和MxFileView.xib组成)。然后我添加了另一个目标:一个Today小部件(“FilesTestAWidget”)。在小部件中使用MxFileView的解决方案:(1)class =“MxFileView”;(2)勾选“从目标继承模块”(或取消勾选并手动输入“FilesTestAWidget”);(3)在应用程序目标中,确保MxFileView.swift和MxFileView.xib都将FilesTestAWidget包括在其目标成员资格中。 - Kenster999
这在我使用Xcode 10.1的默认模板(一个iOS应用程序目标和2个测试目标)开始新项目时发生。对于所有自定义视图控制器,复选框都未被选中(因此占位文本为“无”)。在检查我的故事板中每个自定义视图控制器的复选框后,问题得到解决。 - Mason

59

这对我很有效。

检查你的编译源代码,是否已经添加了那个文件(例如:ViewController.m),在我的情况下,ViewController文件没有被添加,所以它导致了错误。

输入图像描述


@CarmenA,你只需要将“.m”文件添加到“编译源代码”中。对于某些情况来说,这确实是正确且唯一的解决方案。 - Jacksonkr
我尝试了其他几个解决方案,但都没有成功。这个方法起作用了。由于某种奇怪的原因,一个目标缺少一个让我头疼的源文件。 - galactikuh
对我也是如此。这是由于某些获取冲突解决引起的。 - Eldhose

48

这可以在任何6.0及以上版本的Xcode中发生。在Swift项目中重命名一些ViewController类之后,我遇到了这个问题(但我想Obj-C也会出现这种情况)。您只需打开Interface Builder,转到已重命名类的ViewController的Identity Inspector,选择类并按Enter键。那将重新分配已重命名的类到所选的ViewController,并重置模块值,因为在重命名类之后该值会丢失。

针对Xcode 8.1(可能也适用于8.0)的更新:

Xcode 8.1会崩溃。令人烦恼的是,它简单地崩溃而且不会打印任何信息。我追踪了一个小时的幽灵崩溃,才发现是同样的原因 - 在IB中未分配类。如果您遇到一些幽灵崩溃,请先仔细检查IB中是否存在未分配的类。


谢谢您的建议。根据您的建议,似乎导致Xcode将模块(在IB类下)从“无”更新为“当前”。我认为问题在于仅输入名称而没有敲击回车键会导致Xcode未能触发模块更新。 - rockiesGrizzly
这对我有用。我无意中重命名了一个控制器类,因此当视图控制器加载时,它显然不再存在。 - Litehouse

47

启用{{从目标继承模块}}选项,选择了正确的目标模块,问题得到解决。

enter image description here


确认。这帮助我解决了问题。 - Chris8447
当我将一个视图控制器从Objective-C转换为Swift时,通常会遇到这个问题。我会重新输入最后一个字母并按Enter键。这样也可以解决问题。 - DevNebulae

33

我的回答:将自定义模块设置为自定义Pod名称(在我的示例中为自定义类名),如附图所示。

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

基础设施:XCode8,Swift3

输入图像描述


33

有时您提供的控制器会失去当前应用程序的目标成员资格。在这种情况下,按下“模块”字段上的Enter键将不起作用。前往控制器并确保其目标成员资格已设置为当前应用程序。


这也是我的问题 - 多个目标导致类文件意外地未被包含在我正在构建的目标中。 - Ryan Kreager
我合并了文件,但在其中一个目标中错过了这个,非常感谢您的回答。 - Benjamin Jimenez
好的,合并 PBX 打破了目标成员值。 - some_id

19

选择适当的模块来配合我的自定义类,我解决了这个问题。

这就是:

在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,