“Unknown class <MyClass>在Interface Builder文件中;运行时错误

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

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

173711 次浏览

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

当.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 &斯威夫特1.2

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

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

不仅在项目设置中,在目标设置中也必须添加-all_load -ObjC标志。

Core-Plot: Interface Builder file中的未知类CPLayerHostingView

我通过从我的class.h和.m复制文本来修复这个问题,从项目中删除这些类文件,并使用“添加文件”创建新的class.h和.m文件。然后我将代码粘贴回新文件中,一切都运行良好。由于某种原因,文件在创建时没有正确链接。在那之后,我不需要使用任何链接标志。

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

.

此外,如果你在iPhone上测试时遇到同样的问题,在运行之前删除旧应用程序……

祝你好运。帕斯卡

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

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

我试过这个,还有这个网站上列出的其他答案,没有一个能帮我理清头绪。这些注释(来自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

发生这种情况是因为.xib有一个陈旧的链接到旧的App委托,它不再存在了。 我这样修正它:

  • 右键单击.xib并选择“打开为>源代码”
  • 在这个文件中,搜索旧的App委托并将其替换为新的委托

我沿着劳拉建议的路线修复了这个问题,但我不需要重新创建文件。

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

  • 转到查看->实用工具->显示文件检查器
    (这将显示文件检查器到右边,带有.m-file信息)

  • 打开Target Membership部分,并确保您的目标已被此.m文件选中

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

我尝试了你们上面建议的大部分解决方案,但都没有用。在阅读user776904的解决方案后,我怀疑我有同样的问题,因为我从头开始重建我的应用程序,但复制了xib文件从以前的项目。我怀疑xib文件有一个旧项目的引用,导致我的错误,所以我只是删除了我的mainwindow_ipad。Xib文件,并从一个干净的新项目复制在一个新的。这就解决了问题。而且我还没有足够的勇气开始更改xib文件源代码中的部分内容。

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

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

我还复制了aaLuminate-Info。plist文件跨越其他原因-这有一个旧的关键“主nib文件基名”设置为MainWindow。

只要我删除这个关键它修复了问题!

只需删除MyClass。M和。h,并将它们再次添加到项目是我的工作。

在我的例子中,我得到了这个错误,因为我试图通过创建一个新项目来节省一些工作,然后删除几个源文件,并从工作项目中复制同名的源文件。我还复制了我的MainStoryBoard文件,它正在寻找我的RootViewController。然而,当我删除了原来的RootViewController,然后从以前的产品中添加了RootViewController时,很明显,添加文件操作不能像上面建议的那样“检查”目标框。只要参观所有的纽利进口”。M”文件,并确保目标成员框被选中,一切都很好。我认为发生的事情是故事板文件正在寻找一个已从链接中“排除”的类,因为目标成员未选中。确保目标所需的文件在文件检查器的目标成员中如此指定,就可以达到目的。谢谢你帕特!(见上图)

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

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

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

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

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

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

(myclass类);

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

@implementation MyTableViewCell


@end

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

我已经完成了从其他论坛查看.xib作为源代码和查看MyTableViewCell的所有步骤,尽管我已经将它注释出了我的代码。我试过重置模拟器。我甚至尝试将所有的类分解为与接口同名的单独文件,但在此之前都不起作用。

附注:根据我的经验,.h/。M文件与@interface的名称不同。我有几个文件包含不止一个@interface,他们工作得很好。

P.P.S.我有一个更详细的解释,为什么UITableViewCell和UICollectionViewCell在https://stackoverflow.com/a/22797318/539149引起这个错误,以及如何在编译时使用registerClass: forCellWithReuseIdentifier:来揭示它。

我只是想添加这个答案,因为这里的大多数答案(如果不是所有答案)都假设该类实际存在。只是链接器/编译器太笨了,看不到它。因此,答案围绕要么提醒链接器类的存在或创建一个黑客'强迫'存在它。

我的问题发生时,这条消息实际上是谈论一个不存在的类..因此,一个例子将是我返回到一个旧的git修订,它没有某个类的知识。然而编译器会报错该类不存在。

解决方案吗?

  • 整个事情!首先删除所有的构建文件等删除所有的内容在这个目录 ~ /图书馆/开发/ Xcode / DerivedData李< / >
  • 从手机中删除应用程序(如果使用模拟器,则清除模拟器内容)

之后你就可以去了

转到“ProjectName”,点击它,然后进入“Build phases”选项卡,然后点击“compile sources”,然后点击“+”按钮,一个窗口将出现,选择“MyClass”。然后点击“添加”,

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

从接口生成器/故事板被引用到一个不可用的类。

如果是已知类,则没有链接。

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

我在更改类名时看到了这个错误,尽管更新了所有相关的.h和.m。结果,我错过了更新.storyboard文件中的“customClass”值。这样问题就解决了。

我有“未知类RateView在接口生成器”,其中RateView是UIView的子类。我已经在Storyboard场景中放置了一个UIView,并将自定义类字段更改为RateView。尽管如此,这个错误还是出现了。

为了调试,我将我的类的名称改为RateView2,并将所有引用更改为匹配,除了UIView的自定义类字段。错误消息仍然像以前一样出现,RateView是缺失的类。这确认了错误消息与Custom类字段的值相关。我将这个值更改为RateView2,错误消息更改为“未知类RateView2在接口生成器”。某种程度上的进步。

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

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

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

为我工作!

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

Apple Mach-O连接器错误(APActivityIcon) .

当我添加一个选择器视图,然后删除它时,这个问题发生在我身上。如果它能帮助到别人,下面是我最终解决它的方法:

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

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

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

不。:)

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

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

每个苹果文档

对于64位和iPhone操作系统应用程序,有一个链接器错误 阻止objc从静态库加载对象文件 只包含类别,不包含类。解决方法是使用 -all_load-force_load标志。

简而言之,在你的“构建设置”中添加-all_load“其他链接器”标志,你应该没问题。

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

删除错误的最好方法是: 1)选择类文件(.m) 2)在“目标会员”下面,“检查”项目名称条目

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

在我的例子中,它显示了一个甚至不存在的类的错误!我怀疑这是故事板文件中被删除的东西。如果你不能识别错误中的类文件,试试这个:

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

的整位
customClass="UnrecognizedClassName"

3)保存。 4)返回xcode并清理项目,现在试着运行它。< / p >

为我工作。

enter image description here

在我的情况下,我得到这个错误消息由一个非常愚蠢的错误由我:在接口构建器上,我想设置一个UITableViewCell的标识符,但我意外地键入标识符到'自定义类'的接口构建器条目。

我在....之前制造了1000次细胞

如果你有多个StoryBoard并且其中一个StoryBoard使用的是不存在的,那么这个“Interface Builder file中的Unknown class”错误就会在运行时出现。

在我的例子中是一个拼写错误的“自定义类”名称。确保您检查了您所定义的自定义类的故事板。

我在《Swift》中遇到过这种情况。

将.xib文件移动到项目的Base中。Lproj文件夹摆脱了这个错误。

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

有时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">

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

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

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

重要提示:只连接最外层的元素。例如,如果你试图为表中的某些东西提供连接,比如行中的标签,你会得到一个编译器错误,说出口是无效的,不能连接到重复的内容。

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

我将一个类Model.h + Model.m更改为Model.swift。 该对象在接口生成器中与class = Model一起使用。< / p >

一旦我替换了对象,类就不能再加载了。

我所要做的就是把IB的课程参考改为:

Class = Model
Module =

Class = Model
Module = <TARGETNAME>

你会在构建设置中找到<TARGETNAME>。它也是在你生成的Swift-Header中出现的名字:#import "TARGETNAME-Swift.h"

在我的例子中,我有XCode6,指定的类.m文件在构建阶段结束在错误的地方-它应该在编译源之下,但最终在Copy Bundle Resources

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

这个问题似乎并没有过时。

我有同样的问题与Xcode 8和解决它类似于smilebot:

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

    < img src = " https://i.stack.imgur.com/iUFBU.png " > < / p >

  2. 搜索被引用的类&把上面写着

customClass = " UnrecognizedClassName "

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

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

enter image description here

在尝试了这里的大多数建议都没有成功之后,我只是重命名了我的类,然后在xib文件中手动重命名它(源代码是开放的)。问题就这样解决了。

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

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

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

extension Buttons {
public typealias MyButton = MyFrameworkButton
}


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