gpt4 book ai didi

ios - 对 SwiftUI FetchRequest 的更改未触发 View 刷新?

转载 作者:行者123 更新时间:2023-12-02 03:37:57 25 4
gpt4 key购买 nike

使用 FetchRequest 包装器,并更改 View 内获取结果的数据。这在 View 第一次加载时有效, View 会随着每次更改而更新。

问题是,如果我离开 View 并再次返回,获取请求数据的更改将停止刷新 View 。查看更改的唯一方法是导航离开并再次返回。

我正在打印提取请求,并且对数据的更改正在起作用,这解释了为什么如果我再次导航回来, View 会正确显示,但当 View 上的数据发生更改时, View 不会刷新。

这是一个错误还是我做错了什么?

我有一个显示所有期刊的库 View ,第一部分是一个文本字段,允许添加新期刊,第二部分是所有期刊的列表,可以选择这些期刊来切换旁边的复选标记。

第一次添加新期刊并选择它们就可以了。很奇怪的是,如果我离开并返回,它们就会停止工作。


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

}

我通过导航栏中的导航链接从选项卡 View 导航到库 View :


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") }
}
}

我尝试从导航栏项目中删除导航链接,并将其用作标准列表行导航链接,结果是相同的。

最佳答案

有同样的问题。 NavigationLink 立即实例化目标 View 。一旦我将其更改为惰性 View 评估,它就开始为我工作。但它看起来仍然是一个解决方法。

struct LazyView<Content: View>: View {
let build: () -> Content
init(_ build: @autoclosure @escaping () -> Content) {
self.build = build
}
var body: Content {
build()
}
}

参见:https://www.objc.io/blog/2019/07/02/lazy-loading/

NavigationLink(目的地:LazyView(LibraryView()))

关于ios - 对 SwiftUI FetchRequest 的更改未触发 View 刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58357414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com