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

标签 ios swift swiftui

使用 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/

相关文章:

ios - 使用未解析的标识符错误

ios - 如何更新CNContact?获取 CNErrorDomain 代码=2

ios - 具有 EasyIn 动画,然后按顺序缩放动画,因为缩放动画会永远重复

swift - 当 SecureField 在 SwiftUI 中获得焦点/不集中时执行代码

swift - 如何捕获通过 SwiftUI 中的函数更改的值更改?

iphone - 如何在iPhone中的Web View 上显示详细信息(来自Web服务)?

ios tableView 重用问题

swift - 显示用户位置

ios - 如何将 "dispatch_get_main_queue()"分配给 Swift 中的常量?

ios - AWS DynamoDB 对象映射器因 SIGABRT 崩溃