在 CoreData 更改时更新 Swiftui 视图
Updating Switfui View when CoreData changes
我正在处理具有关系的核心数据实体。问题是,然后我将一个项目附加到子数组 UI 没有更新。
var selectedNode : Node
var body: some View {
VStack {
ForEach(selectedNode.childrenArray) { item in
NavigationLink {
Text("Item at \(item.text!)")
} label: {
Text(item.text!)
}
}
}
.toolbar {
ToolbarItem {
Button(action: addItem) {
Label("Add Item", systemImage: "plus")
}
}
}
}
private func addItem() {
withAnimation {
viewContext.performAndWait {
let newItem = Node(context: viewContext)
newItem.text = "Hello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello world"
newItem.dateAdded = Date()
selectedNode.addToChildren(newItem)
do {
try viewContext.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
}
}
正如预期的那样,当您使用 coredata 数组填充视图时,它会根据 coredata 中的任何更改自动更新视图。但是由于我们没有直接使用 coredata 数组来填充视图,我应该如何更新 View
.
想到的一个可能的解决方案是使用 predicate 来获取属于“children array”的项目,这样我们就可以直接使用 coredata 数组来填充 View。但是我目前还无法实现这个。
所有的CoreData对象都是ObservableObject
所以需要包裹在@ObservedObject
里面所以View
可以在有变化的时候刷新
@ObservedObject var selectedNode : Node
此外,请确保您使用的是 @FetchRequest
或 NSFetchedRequestController
,以便可以观察商店的变化。 NSFetchRequest
不观察店铺。
我正在处理具有关系的核心数据实体。问题是,然后我将一个项目附加到子数组 UI 没有更新。
var selectedNode : Node
var body: some View {
VStack {
ForEach(selectedNode.childrenArray) { item in
NavigationLink {
Text("Item at \(item.text!)")
} label: {
Text(item.text!)
}
}
}
.toolbar {
ToolbarItem {
Button(action: addItem) {
Label("Add Item", systemImage: "plus")
}
}
}
}
private func addItem() {
withAnimation {
viewContext.performAndWait {
let newItem = Node(context: viewContext)
newItem.text = "Hello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello world"
newItem.dateAdded = Date()
selectedNode.addToChildren(newItem)
do {
try viewContext.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
}
}
正如预期的那样,当您使用 coredata 数组填充视图时,它会根据 coredata 中的任何更改自动更新视图。但是由于我们没有直接使用 coredata 数组来填充视图,我应该如何更新 View
.
想到的一个可能的解决方案是使用 predicate 来获取属于“children array”的项目,这样我们就可以直接使用 coredata 数组来填充 View。但是我目前还无法实现这个。
所有的CoreData对象都是ObservableObject
所以需要包裹在@ObservedObject
里面所以View
可以在有变化的时候刷新
@ObservedObject var selectedNode : Node
此外,请确保您使用的是 @FetchRequest
或 NSFetchedRequestController
,以便可以观察商店的变化。 NSFetchRequest
不观察店铺。