使用EnvironmentObject通过SwiftUI动态过滤@FetchRequest

问题描述 投票:0回答:1

有没有办法使用EnvironmentOjbect作为NSPredicate来创建FetchRequest?我读了Paul Hudson的这篇文章,这很棒,但我不想将变量传递给

init
。相反,我想使用 EnvrionmentObject。我尝试了以“Edit 9/10/2023”开头的 this post 的回复,但它一直崩溃。

我尝试了这篇文章中的回复之一(以“两年后我有了解决方案”开头的回复),其中

onAppear
vs
onChange
,但它似乎没有使用 NSPredicate 或刷新数据。

@EnvironmentObject var myObject: MyObject
@FetchRequest(sortDescriptors: [SortDescriptor(\.name)]) var scenarios: FetchedResults<Scenario>

...

.onAppear() {

   print("onAppear caseid: \(myObject.Uid)")
   scenarios.nsPredicate = NSPredicate(format: "caseid == %@", myObject.Uid as CVarArg)
            
}
swift swiftui core-data
1个回答
0
投票

您可以调用函数将谓词设置为正文中的第一件事,例如

func updatePredicate() {
    if scenarios.nsPredicate != nil { return }
    scenarios.nsPredicate = NSPredicate(format: "caseid == %@", myObject.Uid as CVarArg)
}

var body: some View {
    let _ = updatePredicate()
    ...
}

这是可以接受的,因为设置谓词不是状态突变。

© www.soinside.com 2019 - 2024. All rights reserved.