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

SwiftUI将TextField内容存CoreData报unrecognized selector如何解决

报错原因分析
  • 核心错误是Cart实例初始化不合法:你在LivrareView的init方法中,当传入model为nil时直接调用Cart()创建实例,NSManagedObject类必须通过关联Core Data上下文的init(context:)方法初始化,否则Core Data不会动态生成属性的访问方法,调用属性时就会触发unrecognized selector崩溃。
  • 业务逻辑冗余:当前代码每次TextField编辑状态变化都会新建一个Cart实例保存,会产生大量无效冗余数据,不符合保留最新地址的需求。
修复步骤

1. 调整LivrareView逻辑

优先读取已保存的Cart记录,不存在时再创建合法的关联上下文实例,直接更新当前实例即可无需重复新建:

struct LivrareView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest(sortDescriptors: [])
    var carts: FetchedResults<Cart>
    @State var adresaTextField : String = ""
    @State var telefonTextField : String = ""
    @State var tacamuriSwitch: Bool = false
    @State var oraLivrare: String = ""
    @State var specificatiiTextEditor: String = "Ex : Nu merge interfonu"
    @State private var currentCart: Cart?
    
    var body: some View {
        ScrollView {
            VStack(alignment: .leading) {
                Text(Texts.livrareViewText1)
                    .foregroundColor(.orange)
                if let currentCart = currentCart {
                    TextField("Ex: str. 16 Decembrie 1989, nr, 23, ap 1, et 1", text: Binding(
                        get: { currentCart.wrappedDeliveryAddress },
                        set: {
                            currentCart.deliveryAddress = $0
                            saveContext()
                        }
                    ))
                }
            }
        }
        .padding(34)
        .onAppear {
            // 优先读取已保存的地址,没有则新建实例
            if let existingCart = carts.first {
                currentCart = existingCart
            } else {
                let newCart = Cart(context: viewContext)
                currentCart = newCart
                saveContext()
            }
        }
    }
    
    private func saveContext() {
        do {
            try viewContext.save()
        } catch {
            let nsError = error as NSError
            fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
        }
    }
    
    public init() {}
}

2. 调用侧保持不变

你原来的TabView调用逻辑不需要修改,直接使用LivrareView().tag(0)即可。

3. 验证Core Data配置

打开Core Data模型文件,选中Cart实体,在右侧数据检查器的Class配置项确认:

  • Class字段填写Cart
  • Module选择Current Product Module
    配置完成后清理项目构建缓存(Xcode顶部菜单栏Product > Clean Build Folder)再运行即可。

内容的提问来源于stack exchange,提问作者4265756b69

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:54:02