“Interface Builder文件中的未知类<MyClass>”运行时出错
即使Interface Builder知道MyClass
,但在启动应用程序时出现错误。
这发生在MyClass
是库的一部分时,如果我直接在应用程序目标中编译类,则不会发生这种情况。
尽pipe在运行时打印出“ Interface Builder文件中的未知类MyClass ”错误,但此问题与Interface Builder无关,而是与链接器无关,因为没有代码直接使用该链接。
当.nib数据(从.xib编译)在运行时被加载, MyClass
被使用一个string引用,但是链接器不分析代码的function,只是代码的存在,所以它不知道。 由于没有其他源文件引用该类,因此链接程序在创build可执行文件时将其优化为不存在。 所以,当苹果的代码试图加载这样一个类,它不能find与它相关的代码,并打印警告。
默认情况下,Objective-C目标将默认设置-all_load -ObjC
标志,这将保留所有的符号。 但是我从一个C ++目标开始,并没有这个目标。 不过,我find了一个解决这个问题的方法,它使链接器保持积极。
我最初使用的黑客是添加一个空的静态例程,如:
+(void)_keepAtLinkTime;
什么都不做,但是我会打一次,比如:
int main( int argc, char** argv ) { [MyClass _keepAtLinkTime]; // Your code. }
这将强制链接器保持整个class级,并且错误消失。
正如jlstrecker在评论中指出的那样,我们并不需要添加_keepAtLinkTime
方法。 只需调用一个现有的,如:
[MyClass class];
做的伎俩(只要你从一个NSObject
派生)。
当然,你可以在代码的任何位置调用它。 我想这甚至可能是无法访问的代码。 这个想法是欺骗链接器,认为MyClass
被用在某个地方,所以它没有那么积极的优化它。
Xcode 6.3.2和Swift 1.2
Swift定义的视图。 一定要覆盖init(coder aDecoder: NSCoder)
。 Objective-C定义了视图控制器。 还有一个梨树上的笔尖。
将模块名称添加到您selectclass级的Nib细节检查器。
我按照劳拉build议的方式解决了这个问题,但是我不需要重新创build这些文件。
-
使用XCode 4,在Project Navigator中 ,select包含正在抱怨的类的.m文件
-
转到查看 – >实用程序 – >显示文件检查器
(这将显示右边的文件检查器 ,与.m文件信息) -
打开“ 目标成员”部分,确保为该.m文件select了目标
当我将我的.m文件添加到我的项目中时,由于某种原因它没有将其添加到我的默认目标中,导致我得到您提到的错误。
这实际上与Interface Builder没有任何关系,这里发生的事情是Xcode并没有从静态库中加载符号。 为了解决这个问题,你需要将-all_load -ObjC
标志-all_load -ObjC
到Other Linker Flags
键项目(也可能是目标)的构build设置。
由于Objective-C只能为每个类生成一个符号,所以我们必须强制链接器通过使用-ObjC标志来加载类的成员,并且还必须通过添加-all_load
链接器来强制包含我们的静态库中的所有对象旗。 如果您迟早会跳过这些标志,您将遇到unrecognized selector
的错误,或者遇到其他exception,例如您在此处观察到的exception。
我今天使用Swift遇到了这个问题。
我将Model.h + Model.m
类改为Model.swift
。 该对象用于Interface Builder中的class = Model
。
只要我replace了对象,就不能再加载这个类了。
我所要做的就是把IB中的类引用从
Class = Model Module =
至
Class = Model Module = <TARGETNAME>
您将在构build设置中find<TARGETNAME>
。 这也是在你生成的Swift-Header中显示的名字: #import "TARGETNAME-Swift.h"
进入“ProjectName”,点击它,然后进入“Build phases”选项卡,然后点击“编译源码”,然后点击“+”button,出现一个窗口,select“MyClass”。 m“文件然后点击”添加“,
build立项目并运行它,问题肯定会解决
这是一个Xcode4caching问题,只需要删除/ Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications /
另外,如果您的iPhone上有相同的问题testing,请在运行之前删除旧的应用程序…
祝你好运。 帕斯夸尔
有时IBuilder错过了customModule="AppName" customModuleProvider="target"
要修复它,打开故事板作为源代码并replace此行:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" sceneMemberID="viewController">
对此:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
转到构build阶段 – >编译源文件并添加新的.m文件。
在我的情况下,它显示了一个错误,甚至不存在! 我怀疑这是在故事板文件中得到的东西。 如果在错误中不能识别类文件,请尝试以下操作:
1)在崇高的或另一个好的编辑器中打开你的项目。 search被引用的类。 2)删除说的整个位
customClass="UnrecognizedClassName"
3)保存。 4)返回到xcode并清理项目,并尝试运行它。
为我工作。
我的情况 – 试图在我的客观C项目中使用一个Swift框架中的类,我得到了这个错误。 解决方法是在Interface Builder / Storyboard中添加该模块的类(swift框架),如下所示。 没有其他的
我只是想添加这个答案,因为大多数,如果不是所有的答案在这里假设该类实际上存在..只是,链接器/编译器是愚蠢的看到它..因此,答案围绕要么提醒链接器的存在或者创build一个黑客来'强制'存在它..
当这个消息实际上是在讨论一个不存在的类的时候,我的问题就会发生……所以一个例子就是我回到一个旧的git修订版本,它不知道某个类是什么……但是编译器却抱怨说,不存在..
解?
- 整个事情 首先删除所有的构build文件等,删除目录〜/ Library / Developer / Xcode / DerivedData中的所有内容
- 从电话本身删除应用程序(如果您正在使用模拟器,请清除模拟器内容)
你应该很好的去追求
删除错误的最佳方法是: 1)select类文件(.m) 2)在“ 目标成员 ”下, 检查项目名称项
我通过从我的class.h和.m复制文本,从项目中删除这些类文件,并使用“Add File”创build具有相同名称的新的class.h和.m文件来解决这个问题。 然后我把代码粘贴到新的文件中,一切都很好。 不知何故文件在创build时没有正确链接。 之后我不需要使用任何链接器标志。
发生这种情况是因为.xib已经有了一个旧的App Delegate的旧链接,而这个旧的App Delegate已经不存在了。 我像这样固定它:
- 右键单击.xib并select打开为>源代码
- 在这个文件中,search旧的应用程序委托,并将其replace为新的
只需在appdelegateappappleindindindfinfinishlanching方法的开头添加下面的代码,那么它会正常工作
[myclass class];
我最后解决了这个问题,我忘了把下面的代码添加到我的.m文件中:
@implementation MyTableViewCell @end
所以这是因为我为我的表格单元格创build了一个占位符@interface,它与.xib文件中的元素有一个连接,但在Interface Builder中存在一个错误,如果没有为类指定@implementation,它找不到它。
我已经从其他论坛看过.xib作为源代码,看到MyTableViewCell的所有步骤,尽pipe我已经从我的代码中注释掉了它。 我曾尝试重置模拟器。 我甚至试图把我所有的类都打破成与接口相同的单独的文件,但是直到这个时候才有效果。
PS在我的经验中,如果.h / .m文件的名称与@interface的名称不同,则无关紧要。 我有几个文件包含多个@interface,他们工作正常。
PPS我有一个更详细的解释为什么UITableViewCell和UICollectionViewCell导致这个错误在https://stackoverflow.com/a/22797318/539149以及如何显示它在编译时使用registerClass:forCellWithReuseIdentifier :.
我尝试了这个和其他在这个网站上列出的答案,没有一个为我整理。 这个评论(从http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html )帮助:
在search和search和search后,我终于发现了隐藏在文件中的这个被删除类的名字。 我必须打开X代码中的界面生成器文件,右键单击它们并select“作为源代码查看”。 然后search它来了
<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
。
在我的情况下,我有XCode6,指定的类.m文件在构build阶段结束了错误的地方 – 它应该已经在编译源 ,但最终在
不仅在项目设置,但在目标设置也必须添加-all_load -ObjC标志..
Core-Plot:Interface Builder文件中的未知类CPLayerHostingView
只要删除MyClass.m和.h并将它们添加到项目再次为我工作。
我在界面生成器文件中有'Unknown class favouritesButton',并将其追踪到一个故事书的场景,其中button在Identity Inspector顶部的Class字段中有一个伪造的自定义类“favouritesButton”。 我打算把这个价值放在下一个领域:身份标签。
改变这个“UIButton”解决了这个问题。
这个问题似乎并没有过时。
我有与Xcode 8相同的问题,并解决它类似于smilebot :
-
在Xcode中打开你的故事板文件作为“源代码”:
-
search被引用的类并删除整个表示
customClass = “UnrecognizedClassName”
- 再次打开你的故事板文件为“interfacebuilder – storyboard”,并重build你的应用程序。
我在Swift中遇到了这个问题。
将.xib文件移动到项目的Base.lproj文件夹中,摆脱了这个错误。
我今天有这个错误,当我的aaLuminate应用程序转换为Xcode 4下的通用。这个应用程序是基于实用程序模板,最初是build立在Xcode 3下。
为了节省时间,我将iPhone主视图和Flipside视图复制到Universal应用程序的相应名称上。 我遇到了“Interface Builder文件中的未知类x”错误。 在我的情况下,这是没有在XIB文件或目标。
我也复制了aaLuminate-Info.plist文件,其他原因 – 这是一个旧的关键“主笔尖文件基名”设置为MainWindow。
一旦我删除了这个键,就解决了这个问题!
在我的情况下,我得到了这个错误,因为我试图通过创build一个新的项目,然后删除几个源文件,并从工作项目中复制相同名称的源文件保存一些工作。 我也复制了我的MainStoryBoard文件,它正在寻找我的RootViewController。 但是,当我删除原来的RootViewController,然后添加到RootViewController从前面的产品,显然添加文件操作无法“检查”目标框如上所示。 通过仅仅对所有新import的“.m”文件进行竞争并确保目标成员框被检查,一切都很好。 我认为发生的事情是故事板文件正在寻找一个从链接中“排除”的类,因为目标成员没有被选中。 确保文件检查器的目标成员资格中指定了目标文件。 感谢帕特! (往上看)
在我的情况下,这是因为我在.h文件中声明了UITableView单元的子类的子类(两个子类的声明都在同一个.h文件中),但是忘了在第二个子类中做一个空的实现.m文件。
不要忘记实现在.h文件中声明的子类的任何子类! 听起来很简单,但很容易忘记,因为如果您使用.h / .m文件中的一个类,Xcode将为您执行此操作。
我有“Interface Builder中的未知类RateView”,其中RateView是UIView的子类。 我已经放弃了一个UIView到我的故事板场景,并将自定义类字段更改为RateView。 不过,这个错误出现了。
为了debugging,我将我的类的名称更改为RateView2,并将所有引用更改为匹配,除了UIView的自定义类字段。 错误消息仍然像以前一样以RateView作为缺失类出现。 这确认错误消息与Custom类字段的值有关。 我将此值更改为RateView2,并将错误消息更改为“Interface Builder中的未知类RateView2”。 进步的种类。
最后,我检查了文件检查器中的源代码文件本身。 在那里,我发现源代码文件(我从教程中复制)没有与我的目标相关联。 换句话说,它没有目标成员。 我检查了使类的源代码文件成为目标应用程序成员的框,并且错误消息消失了。
在我的情况下,我已经删除了一个名为“viewController”的类,没有意识到它是与故事板的身份检查器(在“定制类”的顶部)select。
您只需在身份检查器的“自定义类”字段中为视图控制器select正确的类,或将新类添加到项目中,然后select该类作为“自定义类”。
为我工作!
我添加了文件在目标下的构build阶段,问题得到解决。 有关添加文件的步骤,请参阅我的答案:
苹果Mach-O链接器错误(APActivityIcon)
这使我疯狂了一下,没有上述的build议帮助我摆脱了错误。 幸运的是,我只有一个使用这个类的IB对象,所以我只是删除它,并用指定的相同类添加它。 错误消失了…