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 排序行为