SwiftUI - 在 Coredata 中添加链接对象后视图不更新
SwiftUI - View not updating after adding linked object in Coredata
我有一个名为 InstanceView
的 SwiftUI 视图,它显示了 NagivationView
中 Instance
的详细信息。 NavigationView
中的链接是来自 Coredata 的对象,称为 Instance
s,而且在 Coredata 中,我有一个名为 Solve
的实体。 Instance
与 Solve
是一对多的关系。 InstanceView
显示链接到它的 Solve
的列表。
我的问题是,当我从我的 InstanceView
创建一个新的 Solve
,并将其添加到 Instance
时,新的解决方案没有出现在 InstanceView
直到我 select 一个不同的 Instance
在 NavigationView
和 return 到原来的 Instance
.
这里是 NavigationView
中的 List
,它控制 InstanceView
中显示哪个 Instance
:
List {
ForEach(Array(zip(instances.indices, instances)), id: \.0) { index, instance in
NavigationLink(destination: InstanceView(instance: instance), tag: index, selection: $selectedInstanceIndex) {
InstanceRow(instance: instance)
}
}
}
这是InstanceView
:
struct InstanceView: View {
@Environment(\.managedObjectContext) private var viewContext
var instance: Instance
var body: some View {
List {
ForEach(instance.solveArray, id: \.self) { solve in
Text(String(solve.time))
}
}
.navigationTitle(instance.wrappedName)
.navigationSubtitle(instance.wrappedPuzzle)
Button("add solve") {
addSolve()
}
}
private func addSolve() {
withAnimation {
let newSolve = Solve(context: viewContext)
newSolve.time = 3.2
newSolve.dnf = false
newSolve.plusTwo = false
newSolve.timestamp = Date()
instance.addToSolve(newSolve)
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
}
}
所以我想知道如何强制 InstanceView
更新,以便它显示从其中添加的新 Solve
。
谢谢!
尝试在“InstanceView”中使用它:
@State var instance: Instance
或
@Binding var instance: Instance
如果这不起作用,您最好的选择是将“实例”设为 class 和 ObservableObject 并按此方式执行。
我想通了这一点,并认为我会 post 我的解决方案,以防其他人遇到同样的问题。我可以通过在 var instance: Instance
.
前面添加 @ObservedObject
来解决这个问题
我有一个名为 InstanceView
的 SwiftUI 视图,它显示了 NagivationView
中 Instance
的详细信息。 NavigationView
中的链接是来自 Coredata 的对象,称为 Instance
s,而且在 Coredata 中,我有一个名为 Solve
的实体。 Instance
与 Solve
是一对多的关系。 InstanceView
显示链接到它的 Solve
的列表。
我的问题是,当我从我的 InstanceView
创建一个新的 Solve
,并将其添加到 Instance
时,新的解决方案没有出现在 InstanceView
直到我 select 一个不同的 Instance
在 NavigationView
和 return 到原来的 Instance
.
这里是 NavigationView
中的 List
,它控制 InstanceView
中显示哪个 Instance
:
List {
ForEach(Array(zip(instances.indices, instances)), id: \.0) { index, instance in
NavigationLink(destination: InstanceView(instance: instance), tag: index, selection: $selectedInstanceIndex) {
InstanceRow(instance: instance)
}
}
}
这是InstanceView
:
struct InstanceView: View {
@Environment(\.managedObjectContext) private var viewContext
var instance: Instance
var body: some View {
List {
ForEach(instance.solveArray, id: \.self) { solve in
Text(String(solve.time))
}
}
.navigationTitle(instance.wrappedName)
.navigationSubtitle(instance.wrappedPuzzle)
Button("add solve") {
addSolve()
}
}
private func addSolve() {
withAnimation {
let newSolve = Solve(context: viewContext)
newSolve.time = 3.2
newSolve.dnf = false
newSolve.plusTwo = false
newSolve.timestamp = Date()
instance.addToSolve(newSolve)
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
}
}
所以我想知道如何强制 InstanceView
更新,以便它显示从其中添加的新 Solve
。
谢谢!
尝试在“InstanceView”中使用它:
@State var instance: Instance
或
@Binding var instance: Instance
如果这不起作用,您最好的选择是将“实例”设为 class 和 ObservableObject 并按此方式执行。
我想通了这一点,并认为我会 post 我的解决方案,以防其他人遇到同样的问题。我可以通过在 var instance: Instance
.
@ObservedObject
来解决这个问题