在视图中使用动态属性进行 SwiftData 查询

Mik*_*dar 10 swift swift-data

我试图弄清楚如何创建一个 SwiftUI 视图,该视图使用包含传递到视图中的变量的查询来显示来自 SwiftData 的数据。我猜我将无法使用 @Query 语法,但是有人想出一种可行的方法来执行类似的操作吗?

我是否需要放弃 @Query 并只创建一个实例化它自己的 ModelContainer 和 ModelContext 的视图模型?

这段代码显然无法编译,因为 @Query 引用了 startDate 和 endDate 变量,但这正是我想要的。

struct MyView: View {
    @Environment(\.modelContext) var modelContext

    @Query(FetchDescriptor<Measurement>(predicate: #Predicate<Measurement> {
    $0.date >= startDate && $0.date <= endDate }, sortBy: [SortDescriptor(\Measurement.date)])) var measurements: [Measurement]

    let startDate: Date = Date.distantPast
    let endDate: Date = Date.distantFuture

    var body: some View {
        Text("Help")
    }
}
Run Code Online (Sandbox Code Playgroud)

Joa*_*son 14

您无法进行动态查询(还没有),但解决方法是将日期(或完整谓词)注入视图中并以这种方式创建查询。

@Query var measurements: [Measurement]

init(startDate: Date, endDate: Date) {
    let predicate = #Predicate<Measurement> {
        $0.date >= startDate && $0.date <= endDate
    }

    _measurements = Query(filter: predicate, sort: \.date)
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现这很难相信,所以我去搜索,苹果在他们自己的示例代码中使用了这种方法。请参阅“Backyard Birds”示例项目中的“BackyardSearchResults.swift”:https://developer.apple.com/documentation/swiftui/backyard-birds-sample (2认同)