如何通过读取“[MyClass class]”的行来修复“Interface Builder 文件中的未知类 <MyClass>”错误?

Posted

技术标签:

【中文标题】如何通过读取“[MyClass class]”的行来修复“Interface Builder 文件中的未知类 <MyClass>”错误?【英文标题】:How “Unknown class <MyClass> in Interface Builder file” error can be fixed with a line reads "[MyClass class]"? 【发布时间】:2013-11-09 09:56:11 【问题描述】:

我阅读了以下答案,所以我知道 "Unknown class in Interface Builder file" 错误可以使用 -ObjC 链接器选项解决。 (仅供参考,MyClass 在静态库中。)

https://***.com/a/6092090/534701

我还发现 App Delegate 中的单行 [MyClass class] 代码可以在不使用 -ObjC 选项的情况下处理相同的问题。 我的问题是代码是如何工作的。

根据我上面附加的答案,发生错误是因为我的静态库中的符号未加载。那么,这意味着[MyClass class] 使链接器在运行时加载符号? (这没有意义)

【问题讨论】:

【参考方案1】:

链接器将尝试通过删除未使用的符号来减小最终二进制文件的大小。从 Storyboard 实例化的类是使用反射创建的,因此链接器无法知道该类是否正在使用,因此它已从最终二进制文件中删除。

通过将该行添加到您的代码中,您将强制链接器在编译时(而不是在运行时)添加该类,从而使来自 Storyboard 的反射调用按预期工作。

【讨论】:

谢谢。不要混淆,我添加了一个提示链接器与运行时无关的句子【参考方案2】:

我也遇到过这个问题。接受的答案并没有解决我的答案。这是解决我的答案的方法,我认为应该这样做的实际方式是:

在 IB 中,您可以在其中选择您的班级,下方还有另一个下拉菜单,您可以在其中输入班级名称,称为“模块”。在这里,您可以不选择任何内容(对于 Objective-C 中的类),或者您可以选择一个预填充的模块,通常是您的应用程序的名称。如果你这样做,运行时会理解这个类在一个名为的 Swift 模块中运行并且能够加载它。

这适用于一开始仅作为 Obj-C 并且后来添加了一些 swift 类的项目。

【讨论】:

谢谢!这正是我所需要的。应该修复IB来处理这个问题。

以上是关于如何通过读取“[MyClass class]”的行来修复“Interface Builder 文件中的未知类 <MyClass>”错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过特定的行分隔符读取文本文件?

Myclass.class与new MyClass()有什么区别?

使用POI读取EXCEL中的数据如何获得表中实际数据的行数?

java web工程中读取properties文件,路径一直不知道怎么写

如何使用Gson反序列化Kotlin数组列表?

C++ 类成员存储