我正在嘗試保存我在核心資料中輸入的內容。所以,如果有人不小心關閉了應用程式,文本需要保留在 TextField 中。這就是我嘗試這樣做的方式,但我收到此錯誤訊息:
*** 由于未捕獲的例外“NSInvalidArgumentException”而終止應用程式,原因:“-[Cart deliveryAddress]:無法識別的選擇器發送到實體 0x600002276a00”
這是我的觀點:
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"
@ObservedObject var cart : Cart
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text(Texts.livrareViewText1)
.foregroundColor(.orange)
TextField("Ex: str. 16 Decembrie 1989, nr, 23, ap 1, et 1", text: $cart.wrappedDeliveryAddress, onEditingChanged: { _ in
let newCart = Cart(context: viewContext)
newCart.deliveryAddress = cart.wrappedDeliveryAddress
print(newCart.deliveryAddress)
do {
try viewContext.save()
} catch {
let error = error as NSError
fatalError("Unresolved error\(error)")
}
})
}
}
.padding(34)
}
public init(model: Cart? = nil) {
self.cart = model ?? Cart()
}
}
}
這是我的購物車。我正在使用代碼生成:“手動/無”
@objc(Cart)
public class Cart: NSManagedObject, Identifiable {
}
extension Cart {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Cart> {
return NSFetchRequest<Cart>(entityName: "Cart")
}
@NSManaged public var grams: Double
@NSManaged public var name: String?
@NSManaged public var price: Int32
@NSManaged public var deliveryAddress: String?
public var wrappedDeliveryAddress : String {
get { deliveryAddress ?? ""}
set { deliveryAddress = newValue}
}
}
這是我的核心資料模型的照片:

我怎樣才能使這項作業?
這是我呼叫 View 的地方:
TabView(selection: self.$index){
LivrareView()
.tag(0)
RidicareView()
.tag(1)
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
uj5u.com熱心網友回復:
您遇到的問題是嘗試Cart在公共初始化中創建一個。從本質上講,您是在說先前的視圖是否讓我Cart使用它,否則,我將創建自己的Cart在托管物件背景關系中不存在的視圖。由于您從不Cart向此視圖傳遞 a ,因此您只會得到Cart不在背景關系中的 a。Core Data 的第一條規則是你必須在相同的背景關系中操作。(規則 2 有時您可以違反這一點,但作為初學者不能這樣做。)當您嘗試使用它時,您會遇到錯誤。而且,按照您設定的方式,您不需要它。
我壓縮LivrareView到最低限度,然后添加了一些Text()視圖,以便您可以看到發生了什么。首先,您已經有一個@State用于 adresa的變數。你不需要@ObservedObject var cart那個。然后,當時機成熟時,您將其adresaTextField放入newCart.wrappedDeliveryAddress(您制作了它,您也可以專門使用它并將其設為deliveryAddress私有),然后保存您的物體。我將 save 移出.onEditingChangean.onSubmit()以節省一點理智,但是當您使用此代碼時,該錯誤將變得明顯。每次按回車鍵(而不是像您的代碼那樣每次擊鍵)時,您都在創建一個新物體。我認為這是您在創建 時試圖避免的@ObservedObject var cart,但這行不通。你更好的計劃是簡單地使用所有@State變數,收集您的資料,然后使用“保存”按鈕創建和保存您的托管物件。在您允許保存之前,我也會先驗證您的輸入。
struct LivrareView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(sortDescriptors: []) var carts: FetchedResults<Cart>
@State var adresaTextField : String = ""
var body: some View {
ScrollView {
VStack(alignment: .leading) {
TextField("Ex: str. 16 Decembrie 1989, nr, 23, ap 1, et 1", text: $adresaTextField)
.onSubmit {
let newCart = Cart(context: viewContext)
newCart.wrappedDeliveryAddress = adresaTextField
print(newCart.wrappedDeliveryAddress)
do {
try viewContext.save()
} catch {
let error = error as NSError
fatalError("Unresolved error\(error)")
}
}
Text("adresaTextField is \(adresaTextField)")
Text("Managed Objects:")
ForEach(carts) { cart in
Text(cart.wrappedDeliveryAddress)
}
}
}
}
}
編輯:此外,建議在使用 Core Data 和手動代碼生成時節省一些心痛。創建第三個擴展檔案來放入您的自定義代碼。如果您更改了屬性并需要重新生成擴展,您將洗掉您的自定義代碼。我稱我的為“Cart CoreDataWrappedProperties”。您可以使用您想要的命名擴展名,但如果您重新生成代碼,它將不會被替換。問我怎么知道。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/372685.html
上一篇:如何將函式中的多個修飾符應用于SwiftUI中的給定視圖?
下一篇:滾動時如何不隱藏搜索欄?快速界面
