SwiftUI + Core Data - 更新对象(Detail -> DetailEdit)

Posted

技术标签:

【中文标题】SwiftUI + Core Data - 更新对象(Detail -> DetailEdit)【英文标题】:SwiftUI + Core Data - updating an object (Detail -> DetailEdit) 【发布时间】:2020-12-02 12:54:34 【问题描述】:

目标:使用 SwiftUI 更新核心数据对象:DetailView -> EditDetail -> DetailView(已更新)。

问题:下面的代码有效,但创建了一个新对象,而不是更新现有对象。

import SwiftUI

struct DetailView: View 
    
    var order = Order()
    
    @State var showOrderEdit = false


    var body: some View 
        
        Form
        
        Text(order.tableNumber)
        Text(order.pizzaType)
            
        
        .navigationTitle(order.pizzaType)
        
        .toolbar 

            ToolbarItem(placement: .primaryAction) 
                
                
                //edit button
                Button(action: 
                    showOrderEdit = true
                , label: 
                    Text("Edit")
                )
                .sheet(isPresented: $showOrderEdit) 
                    OrderEdit(order: order)
                
            
        

    


import SwiftUI

struct DetailEdit: View 
    
    @State var tableNumber = ""
    
    @Environment(\.managedObjectContext) private var viewContext
    @Environment (\.presentationMode) var presentationMode

    var order = Order()

    var body: some View 
        
        NavigationView 

        
        Form 
        
            TextField("table number", text: $tableNumber)
            
            
            //update button
            Button(action: 
                updateOrder(order: order)
            ) 
                Text("Update")
                    .foregroundColor(.blue)
            
        
        
        
        //passing data item detail -> item edit
        .onAppear 
            self.tableNumber = self.order.tableNumber
        
        
        .navigationTitle("Edit Order")

    

    
    func updateOrder(order: Order) 
        let newtableNumber = tableNumber
        viewContext.performAndWait 
            order.tableNumber = newtableNumber
            try? viewContext.save()
        
    
    
  

【问题讨论】:

【参考方案1】:

您在每个视图中创建新的Order 对象,因此它将作为新对象存储到数据库中。相反,您需要从父视图(显示 DetailView)注入 CoreData 对象作为观察对象,

struct DetailView: View 
    
    @ObservedObject var order: Order   // << here !!
    
// .. other code

struct DetailEdit: View 
    
    @State var tableNumber = ""
    
    @Environment(\.managedObjectContext) private var viewContext
    @Environment (\.presentationMode) var presentationMode

    @ObservedObject var order: Order          // << here !!

// ... other code

在这种方法中,您将在两个视图中使用 Order 的相同实例,并且它们将被更新,因为观察该实例进行修改。

【讨论】:

天才,伙计!你有赞助人,所以我可以给你一笔小额捐款吗?

以上是关于SwiftUI + Core Data - 更新对象(Detail -> DetailEdit)的主要内容,如果未能解决你的问题,请参考以下文章

从 Core Data 非标量属性更新 SwiftUI 视图

在 SwiftUI 视图中发布后台上下文 Core Data 更改而不阻塞 UI

使用 Core Data 提供的数据(在 SwiftUI 中)并与另一个视图共享

在 SwiftUI 中将 @FetchRequest 与 Core Data 一起使用时修改 nil 排序行为

在 SwiftUI 中将加载的 json 文件中的更改保存到 Core Data

SWIFTUI Core Data 传递数字