jho*_*ule 259 xcode cocoa cocoa-touch interface-builder
即使Interface Builder知道a MyClass
,我在启动应用程序时也会收到错误.
当它MyClass
是库的一部分时会发生这种情况,如果我直接在应用程序目标中编译该类,则不会发生这种情况.
jho*_*ule 219
尽管在运行时打印了" Interface Builder文件中的未知类MyClass. "错误,但是这个问题与Interface Builder无关,而是与链接器无关,链接器没有链接类,因为没有代码直接使用它.
当.nib数据(从.xib编译)在运行时加载时,MyClass
使用字符串引用,但链接器不分析代码功能,只是代码存在,所以它不知道.由于没有其他源文件引用该类,因此链接器在生成可执行文件时会将其优化.因此,当Apple的代码尝试加载这样的类时,它无法找到与之关联的代码,并打印警告.
默认情况下,Objective-C目标-all_load -ObjC
默认设置标志,这将保留所有符号.但我从一个C++目标开始,并没有那个.然而,我找到了解决这个问题的方法,这使得链接器具有攻击性.
我最初使用的黑客是添加一个空的静态例程,如:
+(void)_keepAtLinkTime;
Run Code Online (Sandbox Code Playgroud)
什么都不做,但我打电话一次,如:
int main( int argc, char** argv )
{
[MyClass _keepAtLinkTime];
// Your code.
}
Run Code Online (Sandbox Code Playgroud)
这将强制链接器保留整个类,并且错误消失.
正如jlstrecker在评论中指出的那样,我们并不需要添加_keepAtLinkTime
方法.只需调用现有的,例如:
[MyClass class];
Run Code Online (Sandbox Code Playgroud)
诀窍(只要你从一个派生出来NSObject
).
当然,您可以在代码的任何位置调用它.我想它甚至可以在无法访问的代码中.我的想法是欺骗链接器,使其认为在MyClass
某个地方使用它,以便在优化它时不那么积极.
Swift定义视图.一定要覆盖init(coder aDecoder: NSCoder)
.Objective-C定义视图控制器.而且,梨树上的笔尖.
将模块名称添加到Nib详细信息检查器,您可以在其中选择您的类.
Pat*_*Pat 183
我按照Laura建议的方式解决了这个问题,但我不需要重新创建文件.
使用XCode 4,在Project Navigator中,选择包含它所抱怨的类的.m文件
转到View-> Utilities-> Show File Inspector
(这将显示右侧的File Inspector,带有.m文件信息)
打开" 目标成员资格"部分,确保为此.m文件选择了目标
当我将.m文件添加到我的项目时,由于某种原因它没有将它添加到我的默认目标,这导致我得到你提到的错误.
Ala*_*lan 70
这与Interface Builder没有任何关系,这里发生的是Xcode没有从静态库加载符号.要解决此问题,您应该将-all_load -ObjC
标志添加到Other Linker Flags
项目(以及可能的目标)构建设置的键.
由于Objective-C每个类只生成一个符号,我们必须通过使用-ObjC标志强制链接器加载类的成员,并且我们还必须通过添加-all_load
链接器标志强制包含我们的静态库中的所有对象.如果你迟早会跳过这些标志,你将遇到错误unrecognized selector
或得到其他异常,例如你在这里观察到的异常.
Bes*_*esi 26
我今天使用Swift遇到了这个问题.
我把课改Model.h + Model.m
成了Model.swift
.这个对象在Interface Builder中使用了class = Model
.
一旦我替换了对象,就无法再加载该类.
我必须做的是改变IB中的类引用:
Class = Model
Module =
Run Code Online (Sandbox Code Playgroud)
至
Class = Model
Module = <TARGETNAME>
Run Code Online (Sandbox Code Playgroud)
您将<TARGETNAME>
在构建设置中找到它.它也是生成的Swift-Header中显示的名称:#import "TARGETNAME-Swift.h"
Sub*_*bbu 20
转到"ProjectName",单击它,然后转到"构建阶段"选项卡,然后单击"编译源",然后单击"+"按钮,将出现一个窗口,选择"MyClass". m"文件,然后单击"添加",
构建项目并运行它,问题肯定会得到解决
Ign*_*ual 19
这是一个Xcode4缓存问题,只需删除/ Users/your_user/Library/Application Support/iPhone Simulator/4.3/Applications /下的所有文件夹
此外,如果您在iPhone上进行相同的问题测试,请在运行之前删除旧应用程序...
祝好运.帕斯夸尔
Chi*_*buZ 16
有时IBuilder错过了 customModule="AppName" customModuleProvider="target"
要修复它,请打开storyboard作为源代码并替换此行:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">
Run Code Online (Sandbox Code Playgroud)
对此:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
Run Code Online (Sandbox Code Playgroud)
smi*_*Bot 13
在我的情况下,它显示一个甚至不存在的类的错误!我怀疑这是故事板文件中的东西.如果您在错误中无法识别类文件,请尝试以下操作:
1)在崇高或其他好的编辑器中打开你的项目.搜索被引用的类.2)删除所说的整个位
customClass="UnrecognizedClassName"
Run Code Online (Sandbox Code Playgroud)
3)保存它.4)返回xcode并清理项目,并尝试现在运行它.
为我工作.
Dhi*_*lip 13
我的情况 - 尝试在我的目标c项目中使用来自swift框架的类,我收到了这个错误.解决方案是在Interface builder/Storyboard中添加类的Module(swift框架),如下所示.没有其他的
我只是想添加这个答案,因为大多数(如果不是全部)答案都假设该类实际存在..只是链接器/编译器太笨了而无法看到它...因此答案围绕着警告链接器存在该类或创建一个黑客'强制'存在它..
我的问题发生在这个消息实际上是在讨论一个不存在的类时......所以一个例子就是我回到一个不知道某个类的旧git修订版......然而编译器抱怨所说的类没有'存在..
解?
你应该好好去追寻
我通过从class.h和.m复制文本,从项目中删除这些类文件,并使用"添加文件"创建具有相同名称的新class.h和.m文件来修复此问题.然后我将代码粘贴回新文件,一切都很好.某些文件在创建时没有正确链接.之后我不需要使用任何链接器标志.
我最终解决了这个问题,我忘记将以下代码添加到我的.m文件中:
@implementation MyTableViewCell
@end
Run Code Online (Sandbox Code Playgroud)
所以这是因为我为我的表格单元格创建了占位符@interface,它与.xib文件中的元素有连接,但是如果没有为类指定@implementation,则Interface Builder中存在一个错误,它无法找到它.
我已经完成了从其他论坛查看.xib作为源并看到MyTableViewCell的所有步骤,即使我已经从我的代码中注释了它.我曾尝试重置模拟器.我甚至尝试将我的所有类分解为与接口名称相同的单独文件,但在此之前没有任何工作.
根据我的经验,如果.h/.m文件的名称与@interface的名称不同,则无关紧要.我有几个包含多个@interface的文件,它们工作正常.
PPS我有更详细的解释为什么UITableViewCell和UICollectionViewCell在/sf/answers/1595812291/导致此错误,以及如何在编译时使用registerClass显示它:forCellWithReuseIdentifier:.
发生这种情况是因为.xib已经有一个旧的App Delegate的陈旧链接,它不再存在.我修理它是这样的:
小智 5
我试过这个以及本网站上列出的其他答案,但没有一个为我排序.这条评论(来自http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html)帮助:
搜索,搜索和搜索后,我终于发现了隐藏在文件中的已删除类的名称.我不得不用X代码打开界面构建器文件,右键单击它们并选择"查看为源代码".然后搜索它想出来了
Run Code Online (Sandbox Code Playgroud)<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
.
归档时间: |
|
查看次数: |
170761 次 |
最近记录: |