当前位置: 首页 > 面试题库 >

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

韶宏邈
2023-03-14
问题内容

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


 类似资料:
  • 问题内容: 我目前正在使用基于Web的Twitter客户端,因此我使用了angular.js,node.js和socket.io。我通过socket.io将新的推文推到我的客户端,服务在其中等待新的推文。当一条新的推文到来时,该服务通过$ broadcast发送事件。 在我的控制器中是一个事件侦听器,其中传入的tweet在单独的函数中进行处理。此功能只是将新的推文推入我的推文范围。 现在,我的问题

  • 我有一个具有2个视图\控制器的应用程序: 谢谢你。

  • 在Vue.js中,我有三个模板,它们应该一起工作以触发加载新结果。我的容器模板是一个包含过滤器和结果模板的通用模板。当过滤器模板中的对象发生更改时,我很难在结果模板中触发更改。流程非常简单。以下是我目前的情况以及流程的工作原理: 筛选模板:单击后,我的对象属性将更新为新值,并将此更改发送到容器模板。 容器模板:-此角色仅用于保存筛选器和结果模板,并将修改后的对象传递给结果模板。 结果模板:

  • 问题内容: 当我从纯JavaScript更改输入元素的值时,则不会更新角度模型。有什么方法可以通过在更改后手动触发一些事件来触发更新吗? 完整的示例可以在plunkr上找到。单击按钮后,我希望会以某种方式更新。有办法吗? 问题答案: 您不应该这样做(除非用于 测试 ,但即使如此,也请考虑量角器)。以这种方式与angular交互是一个坏主意。但是,如果必须,这是您的操作方法。 一种不同的中间方式是

  • 我正在Laravel5.1中创建一个应用程序,它以前工作得很好。我在视图文件中所做的任何更改都会反映在浏览器中。现在,在过去3天中,浏览器中未反映任何更改。 以下是我的视图文件: 主人刀身php 我正在将css文件的名称更改为app。但是当我运行应用程序时,它会显示main。源代码中的css。 我在storage/framework中查找了缓存,它显示了带有旧代码“main”的视图文件。css“我

  • 小心使用“set”而不是其他内置方法,因为它不会在更改值后触发事件,正如这里的评论中指出的:如何在水豚中使用fill_in与查找(如果可能) 例如。 <代码>查找(:css,“输入[id$='捐赠\u质押\u数百']”)。设置(“10”) 我正在使用ruby、capybara和site prism。据我所知,site prism的使用方法是获取capybara节点元素,然后对其调用方法,例如单击