"Interface Builder文件中的未知类<MyClass>"在运行时出错

jho*_*ule 259 xcode cocoa cocoa-touch interface-builder

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

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

jho*_*ule 219

尽管在运行时打印了" Interface Builder文件中的未知类MyClass. "错误,但是这个问题与Interface Builder无关,而是与链接器无关,链接器没有链接类,因为没有代码直接使用它.

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

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

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

+(void)_keepAtLinkTime;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

   [MyClass class];
Run Code Online (Sandbox Code Playgroud)

诀窍(只要你从一个派生出来NSObject).

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

Xcode 6.3.2和Swift 1.2

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

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

  • 这些天的另一种可能性是MyClass.m可能不在您的Compile Sources构建阶段.如果将MyClass.h/m拖到项目中,而不是使用"新建文件"创建它们,就会发生这种情况. (51认同)
  • 您不必修改`MyClass`.只需调用它从`NSObject`继承的方法,就像`+ class`一样. (19认同)
  • 虽然在发布原始问题时没有Xcode 4,但以下似乎仍然合适.在Xcode 4中,您可以在File Inspector的Target Membership部分中检查所有需要的`MyClass.m`目标,而不是添加一些虚拟方法来消除错误. (10认同)
  • @JoshBruce你能解释一下Swift解决方案吗?我真的不明白. (6认同)
  • .xib 数据不会在运行时加载。IB编译器将xib编译成nib;笔尖是在运行时加载的东西。 (2认同)

Pat*_*Pat 183

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

  • 使用XCode 4,在Project Navigator中,选择包含它所抱怨的类的.m文件

  • 转到View-> Utilities-> Show File Inspector
    (这将显示右侧的File Inspector,带有.m文件信息)

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

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

  • 这个建议对我有用,虽然略有不同,因为我的"目标会员"复选框已被选中.我取消选中它并重新构建,但随后更改了错误消息以指示我的新类名.重新检查框并重新构建,现在一切正常.比删除缓存文件容易得多! (5认同)

Ala*_*lan 70

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

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

  • 我发现只有`-ObjC`标志才能在我的情况下修复它. (5认同)
  • @Kekoa,因为你的Xcode(LLVM)版本比写这个答案的人更新.如今,使用`-ObjC`足以解决问题. (5认同)

Bes*_*esi 26

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

我把课改Model.h + Model.m成了Model.swift.这个对象在Interface Builder中使用了class = Model.

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

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

Class = Model
Module = 
Run Code Online (Sandbox Code Playgroud)

Class = Model
Module = <TARGETNAME>
Run Code Online (Sandbox Code Playgroud)

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


Sub*_*bbu 20

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

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


Ign*_*ual 19

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

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

祝好运.帕斯夸尔

  • 在项目构建设置中,您需要将"-all_load -ObjC"标志添加到"Other Linker Flags"键.这不是Xcode 4特有的问题,实际上通常与Interface Builder无关. (8认同)
  • 是的 - 更简单的方法是打开iOS模拟器,然后从菜单中选择"重置内容和设置" (6认同)

Chi*_*buZ 16

有时IBuilder错过了 customModule="AppName" customModuleProvider="target"

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

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">
Run Code Online (Sandbox Code Playgroud)

对此:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
 customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
Run Code Online (Sandbox Code Playgroud)


Jac*_*Lee 13

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


smi*_*Bot 13

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

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

customClass="UnrecognizedClassName"
Run Code Online (Sandbox Code Playgroud)

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

为我工作.

在此输入图像描述


Dhi*_*lip 13

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

在此输入图像描述

  • 我在 CocoaPods 安装的 Swift 项目中使用 Swift 框架。这种方法有效。并且模块名称是框架的名称。 (2认同)
  • 这是完美的作品。需要知道为什么删除该模块? (2认同)

abb*_*ood 9

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

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

解?

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

你应该好好去追寻

  • 不能+1这一个,解决了我的问题.我的问题与文件已被删除的情况完全相同,但编译时警告仍然出现. (2认同)

小智 9

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


Lau*_*ura 8

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


Zac*_*ris 7

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

@implementation MyTableViewCell

@end
Run Code Online (Sandbox Code Playgroud)

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

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

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

PPS我有更详细的解释为什么UITableViewCell和UICollectionViewCell在/sf/answers/1595812291/导致此错误,以及如何在编译时使用registerClass显示它:forCellWithReuseIdentifier:.


S B*_*S B 6

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

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


iSp*_*ark 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>
Run Code Online (Sandbox Code Playgroud)

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


Sea*_*ong 5

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


归档时间:

查看次数:

170761 次

最近记录:

6 年,3 月 前