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

Xcode 6 Bug: Unknown class in Interface Builder file

我升级到Xcode6测试版4,现在我的应用程序不断崩溃

Unknown class X in Interface Builder file.

它崩溃是因为假设Xcode找不到我在故事板中链接的自定义类,但它显示它们在Xcode接口中正确链接。

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

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


我打字时解决了这个问题。我想我会回答我的问题,然后把它留给其他任何人,他们在使用Xcode6测试版4时可能会遇到这个问题。

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

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

就是这样!在Xcode6测试版4中,所有自定义对象的当前模块在内部一定设置错误。但是巡查员没有看到这个迹象。

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

下面是一个让事情更清楚的图像:enter image description here


有时xcode会错过customModule="AppName" customModuleProvider="target"

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

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

对此:

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


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

1
@objc(ForumTopicListViewController) class ForumTopicListViewController


这对我很有用……

检查编译的源文件,是否添加了该文件(例如viewcontroller.m),在我的例子中,viewcontroller文件没有添加,所以它给出了错误。

enter image description here


多目标项目

在我的案例中,我正在处理具有多个目标的项目,未选中"从目标继承"问题。选择"从目标继承"解决了我的问题

氧化镁


这可以在6.0以上的任何Xcode中发生。在Swift项目中重命名了一些ViewController类之后,我就遇到了这种情况(但我猜在obj-c中也会发生这种情况)。只需打开接口生成器,转到已重命名其类的ViewController的标识检查器,选择类并按Enter键。这会将重命名的类重新分配给选定的ViewController,并重置在重命名类后丢失的模块值。

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

Xcode8.1刚刚崩溃。简单而恼人的是,只是崩溃了,没有打印任何东西。我花了一个小时追踪那次幻影撞击,只是为了发现这是完全相同的事情——在ib中的未分配类。如果你遇到一些幻影撞击,请先检查ib中的未分配类。


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


我的答案是:将自定义模块设置为与所附屏幕截图上的自定义pod名称(在我的示例中为自定义类名)相同

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

基础设施:xcode8、swift3

enter image description here


我完全按照喀布尔的建议做了相反的事情(不过,谢谢你指出了这一点)。在故事板文件中,找到:

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

并将其替换为:

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

我真不敢相信在Swift编译器和Xcode 6中,我浪费了多少时间来解决错误。


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

这里是:

氧化镁


我在Xcode8中遇到了这个问题,为了解决这个问题,我必须在文本编辑器中修改故事板。

一般来说,寻找你的控制权,从控制实体中删除customModulecustomModuleProvider

给我耍了个花招。


我也有同样的问题。

在我的例子中,Xcode没有将我的自定义类添加到:target>build phase>compile sources。

所以我建议你验证一下你的customclass.m是否在那里。

enter image description here

希望这对你有帮助。


检查你的班级是否有合适的目标成员。


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

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


为了这个我到处搜索。在我遇到一个叫我把项目文件夹移到桌面上的家伙之前,所有的答案都不适合我。它只是自动工作。显然,如果您将文件夹投影到许多文件夹中,Xcode实际上会中断。


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


这些步骤对我有用。

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


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

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

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


我通过在所有视图控制器和视图的标识检查器的自定义类中键入模块名(不幸的是,下拉列表不会显示任何…)来解决这个问题。

您可能还需要指示目标提供者。要实现此目标,可以在源代码模式下打开故事板,并在ViewController和视图尖括号中添加"CustomModuleProvider"属性。


@gfrs所说的是正确的,您需要设置模块。然而,有一次我遇到一个问题,我的班级没有在Class下拉列表中列出。最后,我删除了swift文件,重新启动了xcode并重新创建了该文件。最后,这个类被列出并可以在故事板中使用。

还可以看看这个答案,它看起来可以解决我遇到的"实际"问题。


在我的例子中,我在项目设置中向Other Linker Flags添加了一个标志-ObjC,使其工作。我也试过用-all_load旗,它也很管用。

氧化镁


在我的例子中,Storyboard/XIB中引用的类没有设置目标成员身份。

要解决这个问题,请给这个类的.h.m文件提供与其他类相同的目标成员身份。

No target membership set.


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


当我将故事板从Swift项目移植到Objective-C项目时,我遇到了这个问题,注意到Vvkuznetsov的回答,结果发现两个项目使用了相同的标识符。我"产品"-->clean",然后点击模块和类文本字段上的Enter键。问题解决了。


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

使用xcode 4,在项目导航器中,选择包含它抱怨的类的.m文件。

转到"视图"->"实用程序"->"显示文件检查器"(这将在右侧显示文件检查器,其中包含.m文件信息)

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

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


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

氧化镁


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


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

Sooo,xib文件如下:

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

在我看来,这是一个可怕的解决方案,但苹果希望我们现在就这么做。

这个问题显示了3个可能的解决方法,回到测试版4…很明显,苹果在这种情况下并不是很有帮助,因为他们称之为"按预期工作"。


Xcode版本6.1(6A1052D)也有同样的问题。我认为如果您重命名了您的app/xcode项目,问题就会出现。

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


我在添加新目标后遇到了这个问题,然后使用"新建文件"对话框创建了一个新类,但意外地未能在"创建"对话框中检查新目标和原始目标,因此该对象仅添加到原始目标。解决方案是删除源文件(仅删除引用),然后使用"添加文件"重新添加它们,这次检查两个目标。


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

希望这有帮助!


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

只需要把它改回uiview。


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


对我来说,这是因为我的项目被称为?,_,"


XCode 10停止"优化调试"时,这真的很糟糕。在我的例子中,我用故事板设置了uitableviewdelegate和uitableviewdatasource,忘记了实现那些必需的方法。我只是想先测试视图,然后再实现这些方法,然后崩溃!XCode 9会对这些方法发出警告,但是XCode 10确实使我的代码变慢了,而不是在这个方法上,其他的方法我都经历过这个"错误怀疑"。希望这能帮助一些人。谢谢


当我从基于视图的新项目中删除已经包含的viewcontroller.h&viewcontroller.m文件,并从情节提要中删除与此类相关的场景时,xcode在派生数据文件夹中兑现这些文件,因此,如果您尝试转到窗口->项目->您的项目并删除派生的一切都会好起来的。


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


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


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


在我的例子中,我将应用程序设置为通用应用程序,所以Xcode创建了两个故事板,但我只使用(设计的)iPhone故事板。尝试在ipad中运行应用程序。为了解决这个问题,只需要将应用程序作为iphone的应用程序,并且运行得很好。


Swift 3解决方案。

所有这些都不起作用。

百万千克1点击右窗格上的EDOCX1[0]不起作用。百万千克1百万千克1添加@obj无效。百万千克1百万千克1重新启动不起作用。百万千克1百万千克1由于Xcode中断较长路径而移动到桌面不起作用。……百万千克1

这终于奏效了。

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

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

喂!这是可行的。


我也有同样的问题,但解决方法不一样。

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

当它打开时,进入你的界面生成器项目,你会看到他识别你的脚本,然后你确实点击你的脚本的名字,然后按Enter,你会看到模块输入会自己填充它。

它会像一个魅力!D


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

我们从XIB开始,将图片发布到故事板,但我还没来得及让发布屏幕重新工作。当我最终开始创建一个没有自定义视图控制器(这是不允许的)的裸机启动故事板时,这些控制台错误停止出现。


这对我有用,而其他什么都没有。从终端中的项目目录:

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

在Xcode中打开匹配的文件作为源代码,并将viewcontroller的任何实例更改为您实际需要的。在我的例子中,我需要以source的形式打开的文件是main.storyboard,我将viewcontroller的实例更改为detailviewcontroller。

我从xcode和main.storyboard中删除了两个文件,我认为这导致了这个问题。


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


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


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

最终对我有用的是将库作为pod文件删除,并将其作为静态库直接添加到我的项目中。之后我的一切都很美好。不完全确定类的pod实现"破坏"了什么。


对我来说,我使用的是xcode7+swift2

通过检查我的代码解决了这个问题,我的视图控制器中有一行:

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

然后我意识到导航控制器还没有连接到细节页面。因此,如果您使用自定义ID推送一个新的viewcontroller,最好检查一下。


当我将文件添加到"myapp"时,Xcode6.3也有同样的问题。这是因为我选择了"创建文件夹引用"而不是"创建组"。我删除了这些文件,然后使用"创建组"选项再次添加它们。问题解决了。


发生在我身上的原因是我的班级被标记为@objc,在黑板上找不到模块。删除EDOCX1[2]解决了问题