使用FetchRequest包装器,并在视图内部更改获取结果的数据。该功能在视图首次加载时起作用,该视图随所做的每个更改而更新。
问题是,如果我离开视图导航并再次返回,则获取请求数据的更改将停止刷新视图。查看更改的唯一方法是导航并再次返回。
我正在打印获取请求,并且对数据所做的更改正在起作用,这说明了为什么如果我再次导航回去,视图将正确显示,但是当视图上的数据更改时,视图没有刷新。
这是错误还是我做错了什么?
我有一个显示所有日记的库视图,第一部分是允许添加新日记的文本字段,第二部分是可以选择在所有日记旁边打勾的所有日记的列表。
第一次添加新日记并选择它们是可行的。非常奇怪的是,如果我离开并返回,它们将停止工作。
struct LibraryView: View { // MARK: - PROPERTIES @Environment(\.managedObjectContext) var context @FetchRequest( // entity: Journal.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Journal.name, ascending: true)], animation: .default ) var journals: FetchedResults<Journal> @State private var name = "" // MARK: - INITIAL VIEW - var body: some View { Form { Section(header: Text("New Journal")) { HStack { TextField("Name", text: $name, onCommit: { let newJournal = Journal(context: self.context) newJournal.name = self.name try? self.context.save() self.name = "" }) Button(action: { print("ACTION") }) { Image(systemName: "plus.circle.fill") } } } Section(header: Text("Journals")) { ForEach(journals) { journal in Button(action: { journal.isSelected.toggle() try? self.context.save() }) { HStack { Text(journal.name) Spacer() if journal.isSelected { Image(systemName: "circle.fill") } } } } } }.navigationBarTitle("Library") } }
日记只是一个简单的核心数据模型:
import Foundation import CoreData public class Journal: NSManagedObject, Identifiable { @NSManaged public var name: String @NSManaged public var isSelected: Bool }
我从带有导航栏中导航链接的选项卡视图导航到“库视图”:
struct JournalView: View { // MARK: - PROPERTIES @State private var presentFiltersView = false // MARK: - INITIAL VIEW - var body: some View { NavigationView { Text("Journal") .navigationBarTitle("Journal") .navigationBarItems( leading: NavigationLink(destination: LibraryView()) { Text("Library") }, trailing: Button(action: { self.presentFiltersView = true }) { Text("Filters") }) }.sheet(isPresented: $presentFiltersView) { Text("Filters") } } }
我尝试从导航栏项中删除导航链接,并将其用作标准列表行导航链接,结果是相同的。
想想我知道为什么会这样。问题是我导航到视图的方式。原因是导航栏项中有导航链接。取而代之的是,我自己将导航链接移到了外面,并用一个控制导航链接的活动状态的按钮替换了它。提取请求现在似乎可以正常工作。
之前:
.navigationBarItems(leading: NavigationLink( destination: MyView(), label: { Text("MyView") }))
后:
NavigationLink( destination: MyView(), isActive: $isActive, label: { EmptyView() }) .navigationBarItems(leading: Button( action: self.isActive = true, label: { Text("My View") }))