“Interface Builder文件中的未知类<myclass>”运行时错误</myclass>

时间:2009-11-12 22:33:53

标签: cocoa cocoa-touch xcode interface-builder

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

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

46 个答案:

答案 0 :(得分: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&amp; Swift 1.2

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

将模块名称添加到Nib详细信息检查器中,从中选择您的班级。

答案 1 :(得分:183)

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

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

  • 转到View-&gt; Utilities-&gt; Show File Inspector
    (这将显示右侧的文件检查器,带有.m文件信息)< / p>

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

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

答案 2 :(得分:67)

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

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

答案 3 :(得分: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"

答案 4 :(得分:20)

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

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

答案 5 :(得分:19)

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

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

祝你好运。帕斯夸尔

答案 6 :(得分: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">

答案 7 :(得分:13)

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

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

的整个位
customClass="UnrecognizedClassName"

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

为我工作。

enter image description here

答案 8 :(得分:13)

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

enter image description here

答案 9 :(得分:13)

转到Build Phases-&gt;编译源并添加新的.m文件。

答案 10 :(得分:9)

删除错误的最佳方法是: 1)选择类文件(.m) 2)在&#34; 目标会员&#34;,&#34;检查&#34; 项目名称条目

答案 11 :(得分:9)

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

当这条消息实际上是在谈论一个不存在的类时,我的问题就出现了......所以一个例子就是我回到一个不知道某个类的旧的 git 修订版。然而编译器抱怨说这个类不存在..

溶液?

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

你应该好好追求那个

答案 12 :(得分:8)

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

答案 13 :(得分:7)

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

@implementation MyTableViewCell

@end

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

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

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

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

答案 14 :(得分:6)

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

  

[myclass class];

答案 15 :(得分:6)

这是因为.xib已经有了旧的App Delegate的陈旧链接,而这个链接已不存在了。 我这样解决了它:

  • 右键单击.xib并选择打开为&gt;源代码
  • 在此文件中,搜索旧的App代理并将其替换为新的代理

答案 16 :(得分:5)

在我的情况下,我有XCode6,指定的类.m文件最终在构建阶段的错误位置 - 它应该在编译源下,但最终在 Copy Bundle Resources

答案 17 :(得分: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

答案 18 :(得分:4)

这个问题似乎没有过时。

我在Xcode 8上遇到了同样的问题,解决方法与smilebot类似:

  1. 将您的情节提要文件打开为&#34;源代码&#34;在Xcode中:

  2. 搜索被引用的类别&amp;删除说

  3. 的整个位

    customClass =&#34; UnrecognizedClassName&#34;

    1. 将您的故事板文件打开为&#34; interfacebuilder - storyboard&#34;再次重建你的应用程序。

答案 19 :(得分:3)

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

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

答案 20 :(得分:3)

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

答案 21 :(得分:3)

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

Core-Plot: Unknown class CPLayerHostingView in Interface Builder file

答案 22 :(得分:2)

我在Swift中碰到了这个。

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

答案 23 :(得分:1)

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

答案 24 :(得分:1)

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

Apple Mach-O Linker error (APActivityIcon)

答案 25 :(得分:1)

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

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

为我工作!

答案 26 :(得分:1)

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

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

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

答案 27 :(得分:1)

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

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

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

我删除此密钥后就解决了问题!

答案 28 :(得分:1)

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

答案 29 :(得分:1)

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

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

答案 30 :(得分:0)

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

答案 31 :(得分:0)

在我的情况下,找不到该类,因为它是在框架内的扩展中定义的一个类,如下所示:

extension Buttons {
    public class MyButton: UIButton {
        // ...
    }
}

当我从扩展中提取类时,情节提要最终可以找到该类(MyFrameworkButton):

extension Buttons {
    public typealias MyButton = MyFrameworkButton
}

public class MyFrameworkButton: UIButton {
    // ...
}

答案 32 :(得分:0)

在尝试了大部分建议之后,我只是重命名了我的类,然后在xib文件中手动重命名(打开为源代码)。然后问题就消失了。

答案 33 :(得分:0)

我尝试过你们上面建议的大部分解决方案,但无济于事。从user776904读取解决方案后,我怀疑我遇到的问题与我从头开始重建我的应用程序时遇到的问题相同,但是复制了上一个项目中的xib文件。我怀疑xib文件引用了导致我的错误的旧项目所以我只是删除了我的mainwindow_ipad.xib文件并从一个干净的新项目中复制了一个新文件。这解决了它。而且我的游戏还不足以开始在其源代码中更改xib文件的位。

答案 34 :(得分:0)

在我的情况下,问题是一个死的IBOutlet链接。一旦修好,一切都很好。

答案 35 :(得分:0)

我一遍又一遍地在WatchKit中出现这个错误,似乎有一个用户界面元素没有与代码中的插座绑定。我猜这在WatchKit中是必需的。

class InterfaceController: WKInterfaceController {
    @IBOutlet weak var table: WKInterfaceTable!
}

重要提示:只需连接最外层的元素即可。例如,如果您尝试为表中的某些内容提供连接(如行内的标签),则会出现编译器错误,指出插座无效且无法连接到重复内容。

答案 36 :(得分:0)

在我的例子中,自定义UIView类位于嵌入式框架中。我将自定义UIView头文件更改为“project”为“public”并将其包含在主头文件中。

答案 37 :(得分:0)

来自界面构建器/故事板是指一个不可用的类。

如果是已知类,则不会链接。

如果不是一个类或只是一些字符,那可能是一个错字。 在这种情况下,请检查视图控制器中此“未知类”的所有字段。 在“身份检查器”中(块'自定义类'左侧第3个是一个字段 “类”可能包含错误的值。通常它会列出字段类型 (UIView / UILabel等)。

答案 38 :(得分:0)

这里有很多答案,但没有一个是解决方案, 我将它跟踪到storyBoard,其中控制器有一个无效的自定义类(在我重命名后类不存在)

答案 39 :(得分:0)

当我更改了一个类名时,我看到了这个错误,尽管更新了所有相关的.h和.m。原来,我错过了更新.storyboard文件中的'customClass'值。这解决了这个问题。

答案 40 :(得分:0)

在我的案例中是拼写错误&#34; Custom Class&#34;名称。确保检查故事板中是否有您定义的自定义类。

答案 41 :(得分:0)

运行时出现“Interface Builder文件中的未知类”错误,如果你有一个以上的StoryBoard,而其中一个StoryBoard使用的那个并不存在。

答案 42 :(得分:0)

在我的情况下,我通过一个非常愚蠢的错误得到了这个错误消息:在界面构建器上我想设置UITableViewCell的标识符,但是我偶然地在接口构建器中的'Custom class'条目中键入了标识符。

我之前制作了1000次细胞......

答案 43 :(得分:0)

当我添加一个选择器视图然后将其删除时,我遇到了这个问题。万一它会帮助某人,这就是我最终解决的问题:

  1. 在XCODE上打开文档大纲(不知道什么是文档大纲?我也没有 - 谷歌... :)。

  2. 在文档大纲窗口中找到显示警告消息的场景。

  3. 在有问题的场景中,站在(单击)View上,然后在Utility(google it)窗口中选择Identity inspector选项卡并将自定义类名更改回默认UIView。

  4. 不是吗。 :)

答案 44 :(得分:0)

根据Apple文档

  

对于64位和iPhone OS应用程序,存在一个链接器错误   阻止 -ObjC 从静态库加载对象文件   仅包含类别,不包含任何类。解决方法是使用    -all_load -force_load 标记。

简而言之,在“构建设置”中将 -all_load 添加到“其他链接器”标记,您应该会很好。

http://developer.apple.com/library/mac/qa/qa1490/_index.html

答案 45 :(得分:0)

当我创建一个具有相同名称的新项目并在模拟器中运行它们时,我遇到了这个问题。我重命名了其中一个项目,在模拟器中删除了应用程序,然后运行了一个干净的重新构建。