“未知的课程 在Interface Builder文件中“运行时出错

问题描述 投票:259回答:47

即使Interface Builder知道MyClass,我在启动应用程序时也会收到错误。

MyClass是库的一部分时会发生这种情况,如果我直接在应用程序目标中编译该类,则不会发生这种情况。

cocoa cocoa-touch xcode interface-builder
47个回答
218
投票

尽管“Interface Builder文件中存在未知类MyClass”。在运行时打印错误,此问题与Interface Builder无关,而是与链接器无关,链接器不链接类,因为没有代码直接使用它。

当在运行时加载.nib数据(从.xib编译)时,使用字符串引用MyClass,但链接器不分析代码功能,只是代码存在,因此它不知道。由于没有其他源文件引用该类,因此链接器在生成可执行文件时会将其优化。因此,当Apple的代码尝试加载这样的类时,它无法找到与之关联的代码,并打印警告。

默认情况下,Objective-C目标将默认设置-all_load -ObjC标志,这将保留所有符号。但我从一个C ++目标开始,并没有那个。尽管如此,我找到了解决这个问题的方法,这使得链接器具有攻击性

我最初使用的黑客是添加一个空的静态例程,如:

+(void)_keepAtLinkTime;

什么都不做,但我打电话一次,如:

int main( int argc, char** argv )
{
   [MyClass _keepAtLinkTime];
   // Your code.
}

这将强制链接器保留整个类,并且错误消失。

正如jlstrecker在评论中指出的那样,我们并不需要添加_keepAtLinkTime方法。只需调用现有的,例如:

   [MyClass class];

诀窍(只要你从NSObject派生)。

当然,您可以在代码的任何位置调用它。我想它甚至可以在无法访问的代码中。这个想法是欺骗链接器认为MyClass在某个地方使用,以便它不是那么积极地优化它。

Xcode 6.3.2 & Swift 1.2

Swift定义视图。一定要覆盖init(coder aDecoder: NSCoder)。 Objective-C定义视图控制器。而且,梨树上的笔尖。

将模块名称添加到Nib详细信息检查器,您可以在其中选择您的类。


13
投票

我的情况 - 尝试在我的目标c项目中使用来自swift框架的类,我收到了这个错误。解决方案是在Interface builder / Storyboard中添加类的Module(swift框架),如下所示。没有其他的

enter image description here


9
投票

我只是想添加这个答案,因为大多数(如果不是全部)答案都假设该类实际存在..只是链接器/编译器太笨了而无法看到它...因此答案围绕着警告链接器存在该类或创建一个黑客'强制'存在它..

我的问题发生在这个消息实际上是在讨论一个不存在的类时......所以一个例子就是我回到一个不知道某个类的旧git修订版......然而编译器抱怨所说的类没有'存在..

解?

  • Nuke整个事情!首先删除所有构建文件等删除此目录中的所有内容〜/ Library / Developer / Xcode / DerivedData
  • 从手机本身删除应用程序(如果您使用的是模拟器,则清除模拟器内容)

你应该好好去追寻


9
投票

删除错误的最佳方法是:1)选择类文件(.m)2)在“目标成员资格”下,“选中”项目名称条目


8
投票

我通过从class.h和.m复制文本,从项目中删除这些类文件,并使用“添加文件”创建具有相同名称的新class.h和.m文件来修复此问题。然后我将代码粘贴回新文件,一切都很好。某些文件在创建时没有正确链接。之后我不需要使用任何链接器标志。


7
投票

我最终解决了这个问题,我忘记将以下代码添加到我的.m文件中:

@implementation MyTableViewCell

@end

所以这是因为我为我的表格单元格创建了占位符@interface,它与.xib文件中的元素有连接,但是如果没有为类指定@implementation,则Interface Builder中存在一个错误,它无法找到它。

我已经完成了从其他论坛查看.xib作为源并看到MyTableViewCell的所有步骤,即使我已经从我的代码中注释了它。我曾尝试重置模拟器。我甚至尝试将我的所有类分解为与接口名称相同的单独文件,但在此之前没有任何工作。

附:根据我的经验,如果.h / .m文件的名称与@interface的名称不同,则无关紧要。我有几个包含多个@interface的文件,它们工作正常。

P.P.S.我有更详细的解释为什么UITableViewCell和UICollectionViewCell在https://stackoverflow.com/a/22797318/539149导致此错误以及如何在编译时使用registerClass显示它:forCellWithReuseIdentifier:。


6
投票

发生这种情况是因为.xib已经有一个旧的App Delegate的陈旧链接,它不再存在。我修理它是这样的:

  • 右键单击.xib并选择Open as> Source code
  • 在此文件中,搜索旧的App委托并将其替换为新的委托

6
投票

只需在appdelegate applicatoindidfinishlanching方法的开头添加以下代码,然后它就可以了

[myclass class];


5
投票

我试过这个以及本网站上列出的其他答案,但没有一个为我排序。这条评论(来自http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html)帮助:

搜索,搜索和搜索后,我终于发现了隐藏在文件中的已删除类的名称。我不得不用X代码打开界面构建器文件,右键单击它们并选择“查看为源代码”。然后搜索它想出来了

<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>com.apple.InterfaceBuilder.IBCocoaTouchP lu gin</string>
<string>*this was the class name*</string>

不幸的是,简单地删除最后一行并不能解决问题,抱怨文件中的项目数量错误。你需要删除它上面的行部分中的相应行,它指的是CustomClass


5
投票

在我的情况下,我有XCode6,指定的类.m文件最终在构建阶段的错误位置 - 它应该在Compile Sources下,但最终在


4
投票

不仅在项目设置中,而且在目标设置中,您还必须添加-all_load -ObjC标志。

Core-Plot: Unknown class CPLayerHostingView in Interface Builder file


183
投票

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

  • 使用XCode 4,在Project Navigator中,选择包含它所抱怨的类的.m文件
  • 转到视图 - >实用程序 - >显示文件检查器 (这将显示右侧的文件检查器,带有.m文件信息)
  • 打开“目标成员资格”部分,确保为此.m文件选择了目标

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


4
投票

这个问题似乎没有过时。

我在Xcode 8中遇到了同样的问题并且像qazxsw poi一样解决了它:

  1. 在Xcode中将您的storyboard文件打开为“源代码”:
  2. 搜索被引用的类并删除所说的整个位

customClass = “UnrecognizedClassName”

  1. 再次打开storyboard文件作为“界面构建器 - 故事板”并重建您的应用程序。

3
投票

只需删除MyClass.m和.h并将它们再次添加到项目中就可以了。


3
投票

我在Interface Builder文件中有'Unknown class favouritesButton'并将其跟踪到故事书场景,其中有问题的按钮在Identity Inspector顶部的Class字段中有一个伪造的自定义类“favouritesButton”。我打算将这个值放在下一个字段中:Identity Label。

将其更改为“UIButton”解决了这个问题。


2
投票

我在Swift遇到了这个问题。

将.xib文件移动到项目的Base.lproj文件夹中可以解决此错误。


1
投票

我在今天将我的aaLuminate应用程序转换为Xcode 4下的Universal时出现此错误。此应用程序基于实用程序模板,最初是在Xcode 3下构建的。

为了节省时间,我将iPhone Main和Flipside Views复制到Universal应用程序上的相应名称。我遇到了“界面生成器文件中的未知类x”错误。就我而言,XIB文件或目标中没有任何内容。

由于其他原因,我还复制了aaLuminate-Info.plist文件 - 这有一个旧密钥“主nib文件基本名称”设置为MainWindow。

一旦我删除了这个键就解决了问题!


1
投票

在我的情况下,我得到了这个错误,因为我试图通过创建一个新项目然后删除几个源文件并从工作项目复制相同名称的源文件来保存一些工作。我还复制了我正在寻找我的RootViewController的MainStoryBoard文件。但是,当我删除原始的RootViewController,然后在上一个产品的RootViewController中添加时,显然Add Files操作无法按上面的建议“检查”目标框。通过仅仅访问所有newley导入的“.m”文件并确保检查目标成员资格框,一切都很顺利。我认为发生的事情是故事板文件正在寻找一个已从链接中“排除”的类,因为目标成员资格未经检查。确保在文件检查器的目标成员资格中指定目标所需的文件就可以了。谢谢Pat! (往上看)


1
投票

在我的情况下,这是因为我在.h文件中声明了UITableView单元的子类的子类(两个子类的声明都在同一个.h文件中),但是忘了在第二个子类中创建一个空的实现.m文件。

不要忘记实现在.h文件中声明的子类的任何子类!听起来很简单,但很容易忘记,因为如果您使用每个.h / .m文件一个类,Xcode将为您执行此操作。


1
投票

我有“Interface Builder中的未知类RateView”,其中RateView是UIView的子类。我将UIView放到了Storyboard场景中,并将Custom类字段更改为RateView。仍然出现了这个错误。

为了调试,我将我的类的名称更改为RateView2,并将所有引用更改为匹配,除了UIView的Custom类字段。错误消息仍然像以前一样使用RateView作为缺失的类。这确认错误消息与Custom类字段的值相关。我将此值更改为RateView2,并将错误消息更改为“Interface Builder中的未知类RateView2”。各种进步。

最后,我在File Inspector中检查了源代码文件。在那里,我发现源代码文件(我从教程中复制过的)与我的Target没有关联。换句话说,它没有目标成员资格。我检查了使该类的源代码文件成为目标应用程序成员的框,并且错误消息消失了。


1
投票

在我的情况下,我删除了一个名为“viewController”的类,但没有意识到它是通过故事板的身份检查器选择的(在“自定义类”的顶部)。

您只需在身份检查器的“自定义类”字段中为视图控制器选择正确的类,或者向项目中添加一个新类,并选择该类作为自定义类。

为我工作!


1
投票

我在目标中添加了Build Build Phase下的文件,问题得到了解决。有关添加文件的步骤,请参阅我的回答:

smilebot


69
投票

这与Interface Builder没有任何关系,这里发生的是Xcode没有从静态库加载符号。要解决此问题,您需要将-all_load -ObjC标志添加到项目(以及可能的目标)构建设置的Other Linker Flags键。

由于Objective-C每个类只生成一个符号,我们必须通过使用-ObjC标志强制链接器加载类的成员,并且我们还必须通过添加-all_load链接器标志强制包含我们的静态库中的所有对象。如果你迟早会跳过这些标志,你会遇到unrecognized selector的错误或得到其他异常,例如你在这里观察到的异常。


1
投票

这让我疯了一点,上面的建议都没有帮我摆脱错误。幸运的是,我只有一个IB对象使用该类,所以我只是删除它并将其添加回指定的相同类。错误消失了......


26
投票

我今天使用Swift遇到了这个问题。

我把班级Model.h + Model.m换成了Model.swift。此对象在Interface Builder中与class = Model一起使用。

一旦我替换了对象,就无法再加载该类。

我必须做的是改变IB中的类引用:

Class = Model
Module = 

Class = Model
Module = <TARGETNAME>

你会在构建设置中找到<TARGETNAME>。它也是生成的Swift-Header中显示的名称:#import "TARGETNAME-Swift.h"


20
投票

转到“ProjectName”,单击它,然后转到“构建阶段”选项卡,然后单击“编译源”,然后单击“+”按钮,将出现一个窗口,选择“MyClass”。 m“文件,然后单击”添加“,

构建项目并运行它,问题肯定会得到解决


19
投票

这是一个Xcode4缓存问题,只需删除/ Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications /下的所有文件夹

此外,如果您在iPhone上进行相同的问题测试,请在运行之前删除旧应用程序...

祝好运。帕斯夸尔


16
投票

有时IBuilder错过了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">

13
投票

转到Build Phases-> Compile Sources并添加新的.m文件。


13
投票

在我的情况下,它显示一个甚至不存在的类的错误!我怀疑这是故事板文件中的东西。如果您在错误中无法识别类文件,请尝试以下操作:

1)在崇高或其他好的编辑器中打开你的项目。搜索被引用的类。 2)删除所说的整个位

customClass="UnrecognizedClassName"

3)保存它。 4)返回xcode并清理项目,并尝试现在运行它。

为我工作。

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