即使Interface Builder知道了MyClass
,我在启动应用程序时也会收到错误消息。
当它MyClass
是库的一部分时,会发生这种情况,如果直接在应用程序目标中编译该类,则不会发生这种情况。
即使Interface Builder知道了MyClass
,我在启动应用程序时也会收到错误消息。
当它MyClass
是库的一部分时,会发生这种情况,如果直接在应用程序目标中编译该类,则不会发生这种情况。
Answers:
尽管在运行时显示了“ Interface Builder文件中的Unclass类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
在某个地方使用过,以至于它在优化它时并不那么积极。
Swift的视图定义。确保覆盖init(coder aDecoder: NSCoder)
。视图控制器的Objective-C定义。并且,在一棵洋梨树的鸟嘴。
将模块名称添加到Nib详细信息检查器中,在此处选择您的课程。
MyClass
。只需调用它继承的方法即可NSObject
,例如+class
。
MyClass.m
在File Inspector的Target Membership部分中检查所有所需的目标,而不是添加一些虚拟方法来消除错误。
我按照劳拉的建议修复了此问题,但不需要重新创建文件。
使用XCode 4,在Project Navigator中,选择包含其抱怨的类的.m文件。
转到查看->实用工具->显示文件检查器
(这将在右侧显示文件检查器,并带有.m文件信息)
打开“ 目标成员身份”部分,并确保为此.m文件选择了目标
当我将.m文件添加到项目中时,由于某种原因它没有将其添加到默认目标中,这导致我得到您提到的错误。
这实际上与Interface Builder无关,这里发生的是Xcode并未从您的静态库中加载符号。要解决此问题,您需要将-all_load -ObjC
标志添加到Other Linker Flags
项目(可能还有目标)构建设置的键中。
由于Objective-C每个类仅生成一个符号,因此我们必须通过使用-ObjC标志来强制链接器也加载类的成员,并且还必须通过添加-all_load
链接器标志来强制包含静态库中的所有对象。如果迟早跳过这些标志,将会遇到错误unrecognized selector
或得到其他异常,例如您在此处观察到的异常。
-ObjC
仅凭旗帜就可以解决此问题。
-ObjC
足以解决问题。
我今天确实使用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"
Module
名字就在下拉列表中。这是我的应用程序的名称。
转到“ ProjectName”,单击它,然后转到“ Build phases”选项卡,然后单击“ compile sources”,然后单击“ +”按钮,将出现一个窗口,选择“ MyClass”。 m”文件,然后单击“添加”,
构建项目并运行它,问题一定会得到解决
这是Xcode4缓存问题,只需删除/ Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications /下的所有文件夹
另外,如果您在iPhone上进行相同的问题测试,请在运行之前删除旧应用...
祝好运。Pascual
有时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">
customModule="MyFrameworkName"
。巨大的+10
转到构建阶段->编译源,然后添加新的.m文件。
以我为例,它显示的是甚至根本不存在的类的错误!我怀疑这是情节提要文件中令人讨厌的东西。如果您无法在错误中识别类文件,请尝试以下操作:
1)在Sublime或其他好的编辑器中打开您的项目。搜索要引用的类。2)删除整个说
customClass="UnrecognizedClassName"
3)保存。4)返回到xcode并清理项目,然后立即尝试运行它。
为我工作。
customClass="MyCla"
)。我不删除自定义类的分配,而是谨慎地将其放在我最初打算使用的类中:)
我只想添加此答案,因为此处大多数(如果不是全部)答案都假定该类确实存在。.只是链接器/编译器太笨而看不到..因此答案围绕着提醒链接器存在的方式展开类或创建黑客来“强迫”存在。
当此消息实际上是在谈论一个不存在的类时,我的问题就发生了。所以一个例子是我回到不知道某个类的旧git修订版。但是编译器抱怨说该类没有不存在
解?
那之后你应该很好
消除错误的最佳方法是: 1)选择类文件(.m) 2)在“ 目标成员身份 ”下,“检查”项目名称条目
我通过从class.h和.m复制文本,从项目中删除这些类文件并使用“添加文件”创建具有相同名称的新class.h和.m文件来解决此问题。然后,我将代码重新粘贴到新文件中,一切正常。创建文件时,文件以某种方式未正确链接。在那之后,我不需要使用任何链接器标志。
我终于解决了这个问题,我忘记将以下代码添加到我的.m文件中:
@implementation MyTableViewCell
@end
造成这种情况的原因是因为我为表格单元格创建了一个占位符@interface,该占位符与.xib文件中的元素具有连接,但是Interface Builder中存在一个错误,即如果没有为类指定@implementation,它找不到。
我已经完成了其他论坛的所有步骤,即使我已经从代码中注释掉了.xib作为源并看到MyTableViewCell。我试图重置模拟器。我什至尝试将我所有的类分解为与接口名称相同的单独文件,但在此之前没有任何作用。
PS,根据我的经验,.h / .m文件的名称是否与@interface的名称不同并不重要。我有几个文件包含多个@interface,它们工作正常。
PPS我在https://stackoverflow.com/a/22797318/539149上有UITableViewCell和UICollectionViewCell为什么导致此错误的更详细说明,以及如何在编译时使用registerClass:forCellWithReuseIdentifier:揭示此错误。
发生这种情况是因为.xib具有到旧的App Delegate的陈旧链接,该链接不再存在。我这样修复它:
我尝试了此站点上列出的其他答案,但都没有为我排序。此评论(来自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
。
不仅在项目设置中,而且在目标设置中,您还必须添加-all_load -ObjC标志。
我在Swift中遇到了这个问题。
将.xib文件移动到项目的Base.lproj文件夹中,摆脱了此错误。
就我而言,出现此错误是因为我试图通过创建一个新项目然后删除一些源文件并从工作项目中复制相同名称的源文件来保存一些工作。我还复制了正在寻找RootViewController的MainStoryBoard文件。但是,当我删除了原来的RootViewController并从以前的产品中添加到RootViewController时,显然“添加文件”操作无法如上所述“选中”目标框。通过仅查看所有newley导入的“ .m”文件并确保已选中目标成员资格框,一切都很好。我认为正在发生的事情是故事板文件正在寻找一个由于未选中目标成员资格而从链接中“排除”的类。确保在文件检查器的目标成员身份中如此指定了目标所需的文件,从而达到了目的。谢谢帕特!(往上看)
我有“接口生成器中的未知类RateView”,其中RateView是UIView的子类。我已经将UIView放到Storyboard场景上,并将Custom类字段更改为RateView。仍然出现此错误。
为了进行调试,我将类的名称更改为RateView2,并将所有引用更改为匹配,除了UIView的“自定义类”字段。错误消息仍然像以前一样出现,RateView作为缺少的类。这确认该错误消息与“自定义类”字段的值有关。我将此值更改为RateView2,错误消息更改为“ Interface Builder中的未知类RateView2”。各种进展。
最后,我在文件检查器中检查了源代码文件本身。在那里,我发现源代码文件(是从教程中复制的)与我的Target无关。换句话说,它没有目标成员身份。我选中了使该类的源代码文件成为目标应用程序成员的框,并且错误消息消失了。
我在目标中的“构建阶段”下添加了文件,此问题已解决。有关添加文件的步骤,请参见以下答案:
这让我有点发疯,上面的建议都没有帮助我摆脱错误。幸运的是,我使用该类只有一个IB对象,因此我将其删除并使用指定的相同类将其添加回去。错误消失了...