我有一个迷你 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
})
}
正如评论中提到的,
@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)
}
}