在 SwiftUI 中,View我有一个List基于@FetchRequest显示Primary实体和通过关系连接Secondary实体的数据。当我添加一个带有新的相关次要实体的新实体时,View和它List的更新正确Primary。
问题是,当我Secondary在详细视图中更新连接的项目时,数据库会更新,但更改未反映在Primary列表中。显然,@FetchRequest不会被另一个视图中的更改触发。
当我此后在主视图中添加新项目时,先前更改的项目最终会得到更新。
作为一种解决方法,我还更新Primary了详细信息视图中实体的属性,并将更改正确传播到Primary视图。
我的问题是:如何强制更新@FetchRequestsSwiftUI Core Data 中的所有相关内容?特别是,当我无法直接访问相关实体时/ @Fetchrequests?
import SwiftUI
extension Primary: Identifiable {}
// Primary View
struct PrimaryListView: View {
@Environment(\.managedObjectContext) var context
@FetchRequest(
entity: Primary.entity(),
sortDescriptors: [NSSortDescriptor(key: "primaryName", ascending: true)]
)
var fetchedResults: FetchedResults<Primary>
var body: some View {
List {
ForEach(fetchedResults) { primary in
NavigationLink(destination: …Run Code Online (Sandbox Code Playgroud) 我正在玩SwitUI,试图了解ObservableObject的工作原理。我有一个Person对象数组。当我将新的Person添加到数组中时,它将重新加载到我的View中。但是,如果我更改现有Person的值,则不会在视图中重新加载它
// NamesClass.swift
import Foundation
import SwiftUI
import Combine
class Person: ObservableObject,Identifiable{
var id: Int
@Published var name: String
init(id: Int, name: String){
self.id = id
self.name = name
}
}
class People: ObservableObject{
@Published var people: [Person]
init(){
self.people = [
Person(id: 1, name:"Javier"),
Person(id: 2, name:"Juan"),
Person(id: 3, name:"Pedro"),
Person(id: 4, name:"Luis")]
}
}
Run Code Online (Sandbox Code Playgroud)
struct ContentView: View {
@ObservedObject var mypeople: People
var body: some View {
VStack{
ForEach(mypeople.people){ person in
Text("\(person.name)")
}
Button(action: {
self.mypeople.people[0].name="Jaime"
//self.mypeople.people.append(Person(id: 5, …Run Code Online (Sandbox Code Playgroud) 我有一个带有 Core Data 的 SwiftUI 项目。数据模型是一个简单的一对多和两个主要视图,每个视图的顶部都有一个文本字段和一个用于将新项目添加到下面的列表视图的按钮。第一种观点适用于关系的一方,第二种观点适用于多方。因此,第一个中的 NavigationLink 打开第二个并传递 One 对象。看起来相当标准的东西。创建 One 的方法有效,并且当托管对象上下文保存新项目时,下面的列表会立即更新。但是,在设备上查看时,相同类型的方法不会刷新多方的列表,尽管它在模拟器和预览窗口中运行良好。数据肯定会被保存,因为如果您导航回“一侧”然后重新选择它以重新加载“许多”视图,它会在列表中显示新项目。
我浏览了很多教程、其他问题等,但没有找到原因。我在访问关系的多方方面是否做错了什么,或者我还需要做些什么才能仅刷新多方的视图?谢谢!!!
完整项目可在https://github.com/fahrsoft/OneToManyTest获取
从 ContentView 中,显示一侧(注意:OneView 是一个简单的视图,它获取对象并显示文本。ManyView 也是如此。):
struct ContentView: View {
@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: One.entity(), sortDescriptors: []) var ones: FetchedResults<One>
@State private var newName = ""
@State var isNavTitleHidden = true
var body: some View {
NavigationView {
VStack {
HStack {
TextField("New One", text: self.$newName)
Spacer()
Button(action: {
let newOne = One(context: self.moc)
newOne.name = self.newName
self.newName = ""
try? self.moc.save()
}) {
Image(systemName: "plus.circle.fill") …Run Code Online (Sandbox Code Playgroud)