对SwiftUI FetchRequest的更改不会触发视图刷新?

使用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")

}))

以上是 对SwiftUI FetchRequest的更改不会触发视图刷新? 的全部内容, 来源链接: utcz.com/qa/407164.html

回到顶部