loadNibNamed() 失败:Interface Builder 文件中的未知类 <mangled Swift identifier>

Posted

技术标签:

【中文标题】loadNibNamed() 失败:Interface Builder 文件中的未知类 <mangled Swift identifier>【英文标题】:loadNibNamed() fails: Unknown class <mangled Swift identifier> in Interface Builder file 【发布时间】:2018-08-23 07:31:40 【问题描述】:

我已将代码移至 Xcode 框架,现在 loadNibNamed() 失败(我更改了损坏的 Swift 标识符名称的可读部分):

Unknown class _TtC13MyFramework14MyTableCell in Interface Builder file.

loadNibNamed() 是从具有 MyFramework 目标成员资格的 Swift 文件中调用的。

UITableViewCell 子类 (MyTableCell) 是一个 Obj-C 类。它的头部有publicMyFramework Target Membership,它的.m也是框架的成员。单元格非常简单,有一个UIImageView 和几个UILabels,没有自定义类。

在 XIB 中,表格单元格的 Class 已设置为 MyTableCell。并且,模块到MyFramework,并选择从目标继承模块。

我已经设置了框架的产品包标识符。我使用以下方式获取捆绑包:

[NSBundle bundleWithIdentifier:@"com.mycompany.myframework"];

找到捆绑包;通过打印其bundlePath 进行检查。

我查看了这个问题并尝试了各种变体,例如不分配 ``MyTableCell` 的模块,但没有任何效果。我还使用 Swift 类创建了一个新的单元格 XIB,但结果相同。

有什么我应该/可以尝试的想法吗?

【问题讨论】:

当我从源文件中删除 IBOutlet 并且仍然连接到情节提要时,我经常遇到这个 this class is not key value coding-compliant for the key myImage 错误。所以也许,您在故事板中有名为 myImage 的 Outlet 连接。请检查是否有帮助 class is not key value coding-compliant 是找不到我的子类的副作用。这不是第一个/主要问题。 您是否尝试过以编程方式创建MyTableCell 的实例以查看是否有更多有用的错误消息? @waldrumpus let cell = MyTableCell() 简单有效;刚刚试了一下。 【参考方案1】:

我想出了一些适合我的解决方案 - YMMV。

所以在我的情况下,我需要向 Objective C 运行时公开一些自定义 Swift UIControl 子类。我通过添加这样的注释来做到这一点:

@objc(CustomButton)
public class CustomButton: UIButton 
    // some implementation

当这个类被添加到框架中时,会出现一个错误,和你的非常相似。

Unknown class _TtC9CustomFramework12CustomButton in Interface Builder file.

要解决此问题,我必须修改我的 XIB 文件以删除该模块。

将框架添加到另一个项目时,现在一切正常。没有错误,并且自定义视图按预期显示。

【讨论】:

以上是关于loadNibNamed() 失败:Interface Builder 文件中的未知类 <mangled Swift identifier>的主要内容,如果未能解决你的问题,请参考以下文章

为啥“loadNibNamed”方法返回数组?

目标 C:loadNibNamed 方法:它是如何工作的?

NSBundle 可能不会响应 +loadNibNamed:owner:options:

关闭使用 loadNibNamed 加载的 NIB

loadNibNamed(_:owner:options:) 崩溃

自定义 UITableViewCell:“loadNibNamed:”上的 SIGABRT