即使接口生成器是一个MyClass,我得到一个错误时启动应用程序。
当MyClass是库的一部分时,就会发生这种情况,如果直接在应用程序目标中编译该类则不会发生这种情况。
即使接口生成器是一个MyClass,我得到一个错误时启动应用程序。
当MyClass是库的一部分时,就会发生这种情况,如果直接在应用程序目标中编译该类则不会发生这种情况。
当前回答
在我的例子中,我删除了一个名为“viewController”的类,没有意识到它是用故事板的身份检查器选中的(在顶部的“自定义类”下)。
你只需要在你的身份检查器的自定义类字段中为视图控制器选择正确的类,或者添加一个新类到你的项目中,并选择它作为你的自定义类。
为我工作!
其他回答
尽管在运行时打印了“未知类MyClass in Interface Builder file.”错误,但这个问题与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和Swift 1.2
快速定义视图。确保重写init(coder aDecoder: NSCoder)。视图控制器的Objective-C定义。还有,梨树上的笔尖。
将模块名称添加到Nib详细信息检查器,在其中选择类。
不仅在项目设置中,在目标设置中也必须添加-all_load -ObjC标志。
Core-Plot: Interface Builder文件中的未知类CPLayerHostingView
有时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">
从接口生成器/故事板被引用到一个不可用的类。
如果是已知类,则没有链接。
如果不是一个类,或者只是一些字符,则可能是打字错误。 在这种情况下,检查视图控制器中这个'unknown class'的所有字段。 在“身份检查器”中(块“自定义类”左起第三个)是一个字段 '类',其中可能包含错误的值。通常它会列出字段类型 (UIView / UILabel等)。
我的案例-试图在我的objective - c项目中使用一个swift框架中的类,我得到了这个错误。解决方案是在Interface builder/ Storyboard中添加类的Module (swift框架),如下所示。没有其他的