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
相关产品推荐
相关产品推荐

