在运行时出错“Unknown class in Interface Builder file””?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (130)

即使Interface Builder知道MyClass,但启动应用程序时仍然会出现错误。

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

提问于
用户回答回答于

尽管在Interface Builder文件中有“未知类MyClass”在运行时返回错误。但这个问题与Interface Builder无关,也与链接器无关,因为没有代码直接使用链接器,所以在实际上它没有链接一个类。

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

默认情况下,Objective-C目标将默认设置-all_load -ObjC标志,这将保留所有符号。

添加一个空的静态例程:

+(void)_keepAtLinkTime;

但我只会调用一次:

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

这将迫使链接器保留整个类,并且错误会消失。

在实际上不需要添加_keepAtLinkTime方法,只需调用现有方法:

   [MyClass class];

只要是从NSObject处派生就可以使用这个方法

当然,你可以在你的代码的任何位置调用它,但代码有可能无法访问。这个想法是通过欺骗链接器来让它认为MyClass是在某个地方被使用,所以它在优化时没有那么积极。

Xcode 6.3.2&SWIFT 1.2

Swift定义的视图,并且确保覆盖init(coder aDecoder: NSCoder)。视图控制器的Objective-C定义。

将模块名称添加到选择类的nib细节检查器中。

用户回答回答于

在我的objective - c项目中尝试使用一个swift框架的类的时候,返回了和你一样的error。可以通过在Interface builder/Storyboard中添加类的模块(swift框架)来解决这个问题,如下所示:

用户回答回答于

1)可以在sublime或者别的编辑器中中打开你的项目,然后搜索引用的类。

2)删除整段内容

customClass="UnrecognizedClassName"

3)保存

4)返回到Xcode并清理项目,并尝试运行。

用户回答回答于

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

用户回答回答于

有时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">
用户回答回答于

这是XCode 4缓存问题,只需删除文件夹/Users/your_user/Library/Application Support/iPhone Simulator/4.3/Applications/

另外,如果你在iPhone上测试的时候遇到了相同的问题,那么可以在运行之前删除旧的应用程序。

用户回答回答于
  1. 转到“ProjectName”,单击它,然后转到“Build Stages”选项卡,
  2. 单击“编译源代码”,
  3. 单击“+”按钮,就会出现一个窗口,选择“MyClass”.M文件,
  4. 单击“Add”,

建立并运行这个项目,这个问题就可以得到解决了。

用户回答回答于

我今天使用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"

用户回答回答于

这与Interface Builder没有任何关系,这些符号不会从Xcode的静态库中加载。 要解决这个问题,可以通过将-all_load -ObjC标志添加到项目(可能还有Target)构建设置中的Other Linker Flags项来解决这个问题。

由于Objective-C只能为每个类生成一个符号,所以我们必须强制链接器通过使用-ObjC标志来加载类的成员,并且还必须通过添加-all_load链接器来强制包含来自静态库的所有对象 。如果你跳过这些标志,将会遇到无法识别的unrecognized selector或获取其他异常。

用户回答回答于

我修正了这个问题,但我不需要重新创建这些文件。

  • 使用XCode 4,在Project Navigator中,选择包含它类的.m文件
  • View->Utilities->Show File Inspector

(这将显示文件检查器的权限,与.m文件信息)

  • 打开目标成员部分,并确保你的目标被选为这个.m文件

当我将我的.m文件添加到我的项目中时,由于某种原因它没有将它添加到我的默认目标中,并导致返回与你一样的error。

扫码关注云+社区