iOS13以下版本UIView子类ContentListView无法正常类型转换问题
问题根因
iOS 11、12 版本的 Objective-C runtime 对 Swift 自定义类的识别存在兼容性缺陷:当 Swift 自定义类没有显式暴露给 Objective-C runtime 时,Interface Builder 在解析类绑定时无法正确匹配 Swift 类,会默认生成基类 UIView 实例;而 iOS 13 及以上版本优化了该识别逻辑,因此高版本系统运行正常。你看到的 Unknown class _TtCxxxx 报错就是典型的 runtime 找不到 Swift 重整后的类名的表现。
解决方案
按以下步骤操作即可解决:
- 给
ContentListView类添加@objc标记,显式将类暴露给 Objective-C runtime,代码修改如下:
import UIKit import RxSwift import RxRelay import RxCocoa import SwinjectStoryboard // 新增下面这行@objc标记,指定类名 @objc(ContentListView) class ContentListView: UIView { // 原有类内代码不需要修改 }
- 打开 Storyboard,选中所有绑定了
ContentListView类型的视图,打开右侧「Identity Inspector」面板,确认「Class」输入框内容为ContentListView,「Module」选项取消勾选「Inherit From Target」,手动选择项目的主 Module(即你的 App 名称Kolibree)。 - 清理 Xcode 缓存后重新编译:
- 按快捷键
Command + Shift + K清理现有构建产物 - 关闭 Xcode,删除
~/Library/Developer/Xcode/DerivedData目录下对应项目的缓存文件夹 - 重新打开 Xcode 执行编译运行即可
- 按快捷键
验证方法
可在 ContentListView 的 required init?(coder: NSCoder) 方法中添加断点,iOS 11/12 下运行如果能触发该断点,说明类绑定已经生效,崩溃问题解决。
内容的提问来源于stack exchange,提问作者Bawenang Rukmoko Pardian Putra
相关产品推荐
相关产品推荐

