【问题标题】:"Unknown class <MyClass> in Interface Builder file" error at runtime运行时出现“Interface Builder 文件中的未知类 <MyClass>”错误
【发布时间】:2010-12-16 02:26:41
【问题描述】:

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

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

【问题讨论】:

标签: cocoa cocoa-touch xcode interface-builder


【解决方案1】:

尽管在运行时打印了“Unknown class MyClass in Interface Builder file.”错误,但此问题与 Interface Builder 无关,而是与链接器有关,它没有链接类,因为没有代码直接使用它。

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

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

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

+(void)_keepAtLinkTime;

什么都不做,但我会调用一次,例如:

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

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

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

   [MyClass class];

成功了(只要您从NSObject 派生)。

当然,您可以在代码的任何位置调用它。我猜它甚至可能是无法访问的代码。这个想法是欺骗链接器,让链接器认为MyClass 在某处被使用,这样它就不会那么积极地对其进行优化。

Xcode 6.3.2 和 Swift 1.2

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

将模块名称添加到您选择课程的 Nib 详细信息检查器。

【讨论】:

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

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

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

  • 转到 View->Utilities->Show File Inspector
    (这将在右侧显示 File Inspector,其中包含 .m 文件信息)

  • 打开 Target Membership 部分并确保为此 .m 文件选择了您的目标

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

【讨论】:

  • 确实,有时,链接器错误是由于一开始就没有在目标中编译文件。您描述的是控制文件关联的目标的方法。不幸的是,我的文件已经是我的目标的一部分,但我仍然遇到链接问题。这可能是因为我的库是 C++(而不是 Objective-C),它具有不同的默认链接器标志(参见上面 Alasdair Allan 和 Sijo 的帖子)。
  • 这个建议对我有用,虽然略有不同,因为我的“目标会员”复选框已经被选中。我取消选中它并重新构建,但随后错误消息更改为指示我的新类名。重新检查框并再次构建,现在一切正常。比删除缓存文件容易得多!
  • 通过 Xcode UI 实现的绝佳解决方案。 @electromaggot,当你手动添加类时,Xcode 可能会感到困惑,所以你可能需要添加多个文件。
  • 这也是我的解决方案。我从另一个项目中拖入了一些类文件,这些类文件是引发异常的文件。
  • 我从我的项目中删除了一个文件,然后稍后又添加了相同的文件,这解决了问题。
【解决方案3】:

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

由于 Objective-C 只为每个类生成一个符号,我们必须通过使用 -ObjC 标志强制链接器也加载该类的成员,并且我们还必须通过添加-all_load 链接器标志。如果您迟早跳过这些标志,您将遇到unrecognized selector 的错误或出现其他异常,例如您在此处观察到的异常。

【讨论】:

  • 我发现在我的情况下,仅-ObjC 标志就修复了它。
  • @Kekoa 这是因为您的 Xcode (LLVM) 版本比编写此答案的人使用的版本更新。如今,使用-ObjC 足以解决问题。
  • 这只对我有帮助。在编译期间,它显示了必要的框架相关问题,一旦我导入所有框架,这些问题也得到了解决。
  • -ObjC 标志单独解决了我的问题。我实际上在 iOS7 中有 all_load 属性时出错。
  • 使用 -all_load -ObjC 可能会导致产品尺寸不必要的增加。此问题仅在框架中也发生在类别文件中。
【解决方案4】:

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

我将课程 Model.h + Model.m 更改为 Model.swift。 此对象在 Interface Builder 中与class = Model 一起使用。

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

我必须做的是将 IB 中的类引用从:

Class = Model
Module = 

Class = Model
Module = <TARGETNAME>

您会在构建设置中找到&lt;TARGETNAME&gt;。它也是您生成的 Swift-Header 中显示的名称:#import "TARGETNAME-Swift.h"

【讨论】:

  • 这似乎是正确的答案。除非有人另有说明,否则应将其标记为正确。
  • 很好的答案,谢谢。对我来说,Module 的名字就在下拉菜单中。这是我的应用程序的名称。
  • 它对我有用。对于我的问题,您的答案中提到的 是包含该类的框架名称。
  • 我自己得出结论,这也是我遇到的错误,并且当我看到您的帖子时愿意发布我的发现。我实际上看到了它,但因为它周围的许多答案和噪音而错过了它。我认为您的答案可以通过一些屏幕截图来改进,以将您的答案与其他答案区分开来。如果是这样,我肯定会抓住它。无论如何,非常感谢您在这里发布。你得到了我的支持。
  • 对于 AppDelegate,我能够在 Interface Builder UI 中解决这个问题。对于窗口内 UI 元素的自定义类,Interface Builder UI 不允许我设置自定义类和模块。我必须执行以下操作:(1)将 .xib 文件作为“源代码”打开(右键单击它)。 (2) 在 customClass 属性旁边添加属性“customModule=”。
【解决方案5】:

进入“项目名称”,点击它,然后进入“构建阶段”选项卡,然后点击“编译源代码”,然后点击“+”按钮,会出现一个窗口,选择“MyClass.m”文件,然后点击“添加”,

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

【讨论】:

  • 是的,我没有选中所有我想添加到我新导入的类的目标框。谢谢!
  • 是的! Target 项目中缺少我的 VC 文件。
【解决方案6】:

是Xcode4缓存问题,删除下所有文件夹即可 /Users/your_user/Library/Application Support/iPhone Simulator/4.3/Applications/

另外,如果您在 iPhone 上测试时遇到同样的问题,请在运行之前删除旧应用...

祝你好运。帕斯夸尔

【讨论】:

  • 在项目构建设置中,您需要将“-all_load -ObjC”标志添加到“其他链接器标志”键。这不是 Xcode 4 特有的问题,实际上通常也与 Interface Builder 无关。
  • 此解决方案已在 2010 年 1 月提出(见上文)。
  • 是的 - 更简单的方法是打开 iOS 模拟器,然后从菜单中选择“重置内容和设置”
  • 或者你可以像我一样,从模拟器主屏幕中删除有问题的应用程序。我收到了同样的错误消息,但它引用了旧的应用程序委托。
【解决方案7】:

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

要修复它,请将情节提要作为源代码打开并替换此行:

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

到这里:

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

【讨论】:

  • 在我运行设置后使用 Xcode 6.3 (6D570) 将恢复为原始(坏)设置。漏洞?我正在尝试在 Objective C 项目中包含一个 swift 文件。
  • 在 XCode 6.4 上,只需在情节提要源代码中添加 customModuleProvider="target",在所需的视图控制器下,即可解决问题。
  • 我只用customModule="MyFrameworkName" 就能解决我的问题。巨大的+10
  • 其实我的问题正好相反,我想删除 CustomTget 但 Xcode 并没有改变 xib 源文件,所以我不得不删除 customModule="AppName" customModuleProvider="target" 才能做到工作。
【解决方案8】:

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

【讨论】:

  • 我在 CocoaPods 安装的 Swift 项目中使用 Swift 框架。这种方法有效。并且模块名称是框架的名称。
  • 这是完美的作品。需要知道为什么要删除该模块吗??
  • 完美配合 cocoapod 框架问题...感谢您的完美回答...
【解决方案9】:

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

【讨论】:

  • 是的,在将以前项目中的新文件添加到 XCode 4.5 项目中后,将 .m 文件添加到 Compile Sources 列表中肯定可以完成。添加“-all_load -ObjC”在我的情况下不起作用,但没有伤害。
【解决方案10】:

在我的例子中,它显示了一个甚至不存在的类的错误!我怀疑这是故事板文件中出现的问题。如果您无法识别错误中的类文件,请尝试以下操作:

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

customClass="UnrecognizedClassName"

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

为我工作。

【讨论】:

  • 我使用 OSX TextEdit 应用程序。这个操作效果很好。请务必先关闭您的项目并关闭 Xcode。
  • 这也有帮助。我有多个具有相同 customClass 的对象,我可能单击了视图而不是控制器并分配了相同的名称。
  • 这也是我遇到的问题的解决方法;我之前输入了一个部分类名,并且故事板以某种方式保存(例如customClass="MyCla")。与其删除自定义类分配,不如将我打算首先使用的类简单地放入其中是明智的:)
【解决方案11】:

我只想添加这个答案,因为这里的大多数(如果不是全部)答案都假设该类确实存在。只是链接器/编译器太笨而看不到它。因此,答案围绕着提醒链接器类的存在或创建一个黑客来“强制”它存在..

我的问题发生在这条消息实际上是在谈论一个不存在的类时。所以一个例子是我恢复到不知道某个类的旧 git 修订版。然而编译器抱怨说该类不存在..

解决方案?

  • Nuke 整件事!首先通过删除 all 此目录中的内容来删除所有构建文件等 ~/Library/Developer/Xcode/DerivedData
  • 从手机中删除应用程序(如果您使用的是模拟器,请清除模拟器内容)

你应该很好地去追求那个

【讨论】:

  • 不能 +1 这一个,解决了我的问题。我的问题与文件已被删除但编译时仍然出现警告的情况完全相同。
  • 在情节提要中,您必须填写标识符。有时我错误地将它写在“类”字段(在身份检查器中)。所以编译器抱怨类不存在的原因!
【解决方案12】:

消除错误的最佳方法是: 1) 选择类文件 (.m) 2) 在“Target Membership”下,“检查”项目名称条目

【讨论】:

  • 这行得通。我正在开发一个 pod,由于某种原因,pod install 命令将错误的目标应用于一个特定的类文件。它被应用于我拥有的资源包。正确的配置是 Pods--
  • 这对我不起作用。目标成员是正确的,但错误不断发生。
【解决方案13】:

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

【讨论】:

  • 当我第一次创建文件时,我最后没有.m。我尝试重命名文件并将其重新添加,但是在 xcode 满意之前我仍然必须删除并重新创建文件。
  • 您的文件可能不是您的目标的一部分。重新添加它可能最终会在正确的目标中添加一个默认复选框。
  • 这个解决方案也对我有用,但我 100% 确定在删除第一个类 (.h + .m) 之前,我检查了它是否是我的目标的一部分。这对我来说不是问题。像 Laura 一样,我只是删除了该课程并重新创建了它(使用不同的名称),它运行良好,此页面上没有任何其他解决方案。
【解决方案14】:

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

@implementation MyTableViewCell

@end

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

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

附:根据我的经验,.h/.m 文件的名称是否与@interface 的名称不同并不重要。我有几个包含多个 @interface 的文件,它们工作正常。

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

【讨论】:

    【解决方案15】:

    发生这种情况是因为 .xib 具有指向不再存在的旧 App Delegate 的陈旧链接。 我这样修复它:

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

    【讨论】:

    • Open as Source Code 不再存在,但您可以轻松地右键单击,在 Finder 中显示,然后右键单击文件,然后在 TextEdit 中打开。当然,在进行任何更改之前备份文件;)
    【解决方案16】:

    只需在appdelegate applicatoindidfinishlanching方法的开头添加以下代码,就可以正常工作了

    [我的班级];

    【讨论】:

      【解决方案17】:

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

      【讨论】:

      • 感谢您,我开始查看列表并发现我的文件丢失了,可能是我创建它时没有设置正确的目标
      【解决方案18】:

      我尝试了这个以及该网站上列出的其他答案,但没有一个适合我。这个 cmets(来自 http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html)帮助了:

      找了又找,终于发现这个被删除的类的名字隐藏在一个文件里。我必须在 X-code 中打开界面生成器文件,方法是右键单击它们并选择“作为源代码查看”。然后搜索它想出了

      <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

      【讨论】:

        【解决方案19】:

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

        Core-Plot: Unknown class CPLayerHostingView in Interface Builder file

        【讨论】:

          【解决方案20】:

          这个问题似乎并不过时。

          我在 Xcode 8 上遇到了同样的问题,并以类似 smilebot 的方式解决了它:

          1. 在 Xcode 中将您的故事板文件作为“源代码”打开:

          2. 搜索被引用的类并删除整个位

          customClass="UnrecognizedClassName"

          1. 再次以“interfacebuilder - storyboard”的形式打开您的故事板文件并重新构建您的应用。

          【讨论】:

            【解决方案21】:

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

            【讨论】:

              【解决方案22】:

              我有“Interface Builder 文件中的未知类 favouritesButton”,并将其追踪到一个故事书场景,其中相关按钮在 Identity Inspector 顶部的“类”字段中有一个虚假的自定义类“favouritesButton”。我打算将该值放在下一个字段中:身份标签。

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

              【讨论】:

                【解决方案23】:

                我在 Swift 中遇到了这个问题。

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

                【讨论】:

                • 感谢分享,但这并没有解决我的问题。这是我终于找到的解决方案:stackoverflow.com/a/28760089/456434
                • 我也遇到过这个问题。但在我的情况下,缺少模块名称是问题所在:请参阅 stackoverflow.com/a/29013058/784318>
                【解决方案24】:

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

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

                由于其他原因,我还复制了 aaLuminate-Info.plist 文件 - 这将旧键“Main nib file base name”设置为 MainWindow。

                我一删除这个密钥,问题就解决了!

                【讨论】:

                  【解决方案25】:

                  在我的例子中,我遇到了这个错误,因为我试图通过创建一个新项目然后删除几个源文件并从工作项目中复制同名的源文件来节省一些工作。我还复制了我的 MainStoryBoard 文件,该文件正在寻找我的 RootViewController。但是,当我删除了原来的 RootViewController,然后从以前的产品中添加到 RootViewController 中时,显然 Add Files 操作未能按照上面的建议“检查”目标框。通过查看所有 newley 导入的“.m”文件并确保选中了目标成员框,一切都很好。我认为发生的事情是情节提要文件正在寻找一个已从链接中“排除”的类,因为未选中目标成员资格。确保在文件检查器的目标成员资格中如此指定目标所需的文件就可以了。谢谢帕特! (见上文)

                  【讨论】:

                    【解决方案26】:

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

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

                    【讨论】:

                      【解决方案27】:

                      我有“Interface Builder 中的未知类 RateView”,其中 RateView 是 UIView 的子类。我已将 UIView 拖放到我的 Storyboard 场景中,并将自定义类字段更改为 RateView。尽管如此,还是出现了这个错误。

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

                      最后,我在文件检查器中检查了源代码文件本身。在那里我发现源代码文件(我从教程中复制的)与我的目标无关。换句话说,它没有目标会员。我选中了使类的源代码文件成为目标应用程序成员的框,错误消息消失了。

                      【讨论】:

                        【解决方案28】:

                        在我的例子中,我删除了一个名为“viewController”的类,没有意识到它是通过情节提要的身份检查器选择的(在顶部的“自定义类”下)。

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

                        为我工作!

                        【讨论】:

                          【解决方案29】:

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

                          Apple Mach-O Linker error (APActivityIcon)

                          【讨论】:

                            【解决方案30】:

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

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2014-09-18
                              • 2015-05-21
                              • 2015-07-06
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多