即使接口生成器是一个MyClass,我得到一个错误时启动应用程序。

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


当前回答

我试过这个,还有这个网站上列出的其他答案,没有一个能帮我理清头绪。以下评论(来自http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html)有助于:

在搜索、搜索、搜索之后,我终于发现了这个被删除的类的名称隐藏在一个文件中。我必须在X-code中打开界面构建器文件,右键单击它们并选择“查看源代码”。然后我找到了 <object class="NSMutableArray" key="dict.values"> < bool关键= " EncodedWithXMLCoder " >对< / bool > <字符串> com.apple.InterfaceBuilder。IBCocoaTouchP lu gin</string> 这是类名*</string>

不幸的是,简单地删除最后一行并不能解决这个问题,它会抱怨文件中有错误的项数。您需要在它上面的行部分中删除对应的行,它引用CustomClass。

其他回答

尽管在运行时打印了“未知类MyClass in Interface Builder file.”错误,但这个问题与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

快速定义视图。确保重写init(coder aDecoder: NSCoder)。视图控制器的Objective-C定义。还有,梨树上的笔尖。

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

我有“Interface Builder file中的未知类favoritesbutton”,并将其追踪到一个故事书场景,其中有问题的按钮在身份检查器顶部的class字段中有一个伪自定义类“favoritesbutton”。我想把这个值放在下一个字段:Identity Label。

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

转到构建阶段->编译源代码并添加新的。m文件。

在我的例子中,问题是一个死的IBOutlet链接。一旦这个问题解决了,一切又恢复了正常。

在我的例子中,我使用了来自另一个项目的故事板。在看了故事板文件xml之后(例如在TextWrangler中),我注意到一个控制器的“customModule”xml属性值是错误的(它仍然引用旧的项目)。手动更改可以解决这个问题。