You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加新Core Data版本后NSValueTransformer无法找到的问题求助

解决Core Data新增版本后找不到NSAttributedStringTransformer的问题

核心原因

添加Core Data新版本后,自定义转换器未被正确注册,或者模型配置出现偏差,导致Core Data加载新模型时无法匹配到对应的转换器类。

具体解决步骤

1. 确保转换器在Core Data启动前完成注册

自定义转换器必须在Core Data加载模型文件前完成注册,否则新模型版本无法识别它。两种实现方式:

方式一:启动时手动注册

在App的启动入口(比如AppDelegate的application(_:didFinishLaunchingWithOptions:)方法,或SwiftUI的App结构体init方法)中添加注册代码:

ValueTransformer.setValueTransformer(NSAttributedStringTransformer(), forName: NSValueTransformerName(rawValue: "NSAttributedStringTransformer"))

方式二:给转换器添加自动注册逻辑

修改你的NSAttributedStringTransformer类,增加静态注册方法,再在启动时调用:

@objc(NSAttributedStringTransformer)
class NSAttributedStringTransformer: NSSecureUnarchiveFromDataTransformer {
    override class var allowedTopLevelClasses: [AnyClass] {
        return super.allowedTopLevelClasses + [NSAttributedString.self]
    }

    // 添加自动注册方法
    static func register() {
        let transformer = NSAttributedStringTransformer()
        ValueTransformer.setValueTransformer(transformer, forName: NSValueTransformerName(rawValue: "NSAttributedStringTransformer"))
    }
}

然后在启动入口调用:

NSAttributedStringTransformer.register()

2. 检查新模型版本的属性配置

打开.xcdatamodeld文件,切换到新增的Core Data版本:

  • 选中NotesEntity实体,找到note属性
  • 在右侧Attribute Inspector面板中,检查Transformer字段是否准确填写NSAttributedStringTransformer,类名大小写必须与代码中@objc()括号内的名称完全一致
  • 确认Transformer配置项未被误删或修改

3. 清理缓存并重新构建

Xcode缓存可能残留旧模型配置,执行以下操作:

  • 删除Derived Data:Xcode → Settings → Locations → Derived Data,点击右侧箭头打开文件夹后删除当前项目的缓存文件夹
  • 执行Clean Build Folder(快捷键Shift + Command + K)
  • 重新构建并运行项目

4. 验证迁移配置(若使用自动迁移)

如果开启了Core Data自动迁移,确保persistentContainer配置正确:

let container = NSPersistentContainer(name: "YourModelName")
guard let description = container.persistentStoreDescriptions.first else {
    fatalError("Failed to get persistent store description")
}
// 开启自动迁移
description.shouldMigrateStoreAutomatically = true
description.shouldInferMappingModelAutomatically = true

container.loadPersistentStores(completionHandler: { (storeDescription, error) in
    if let error = error as NSError? {
        fatalError("Unresolved error \(error), \(error.userInfo)")
    }
})

内容的提问来源于stack exchange,提问作者Petr Smejkal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 16:12:19