对 macOS 上的 SwiftUI 表中显示的 SwiftData 查询进行排序

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

我有一个迷你 macOS 应用程序,在表上呈现 SwiftData 中保存的一些数据。

我想通过单击表格的列标题对数据进行排序,这样表格上就有一个

KeyPathComparator

但是由于

@Query
的结果是仅获取,我无法设置项目的排序。 有什么建议吗?

这是我的桌子:

    @Query private var items: [Product]
    
    @State private var sortOrder = [KeyPathComparator(\Product.category?.name)]
    
    var body: some View {
        Table(items, sortOrder: $sortOrder) {
            TableColumn("Category",value: \.category!.name)
            TableColumn("Design", value: \.design!.name)
            TableColumn("Market", value: \.market!.name)
            TableColumn("Link", value: \.link)
        }
        .onChange(of: sortOrder, { oldValue, newValue in
            items.sort(using: newValue) // ERROR: Cannot use mutating member on immutable value: 'items' is a get-only property
        })

    }
macos sorting swift-data swiftui-table
1个回答
0
投票

正如评论中提到的,

@Query
Table
不能很好地协同工作,至少在排序方面是这样。这是解决此问题的一种方法,但使用第二个数组作为计算属性,根据
Table
的排序顺序参数进行排序。

@Query private var items: [Product]

@State private var sortOrder = [KeyPathComparator(\Product.category?.name)]

var sortedItems: [Product] {
    items.sorted(using: sortOrder)
}

var body: some View {
    Table(sortedItems, sortOrder: $sortOrder) {
        TableColumn("Category",value: \.category!.name)
        TableColumn("Design", value: \.design!.name)
        TableColumn("Market", value: \.market!.name)
        TableColumn("Link", value: \.link)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.