如何对列表 SwiftData 中的数据重新排序?

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

我知道我们可以直接在@Query中排序和排序,但是我正在尝试实现一个功能以允许用户使用列表(在编辑模式下)手动排序

@Query(sort: \FavouriteCommunity.order) private var favouriteCommunities: [FavouriteCommunity]

List {
    Section("Top communities") {
        // Some other views
    }
    Section("Favorites") {
        ForEach(favouriteCommunities) { item in
            NavigationLink(value: item) {
                FavouriteCommunityCellView(item: item)
            }
        }
        .onMove { from, to in
            favouriteCommunities.move(fromOffsets: from, toOffset: to)
        }
    }
}

我收到错误:无法对不可变值使用变异成员:“favouriteCommunities”是仅获取属性

当我使用 @Bindable 时,我实际上可以编辑 FavouriteCommunityCellView(item: item) 中的项目,因此我知道可以在对象级别进行编辑。查询似乎无法改变,所以很好奇是否有人对如何在 SwiftData 之上创建重新排序功能有任何建议。谢谢!

swiftui swift-data
1个回答
0
投票

我也有类似的问题。这是我的解决方案应用于您的具体示例。我希望这有帮助。

.onMove(perform: { indices, newOffset in
        var s = favouriteCommunities.sorted(by: { $0.order < $1.order })
        s.move(fromOffsets: indices, toOffset: newOffset)
        for (index, item) in s.enumerated() {
                item.order = index
        }
        try? self.modelContext.save()
 })

基本上,您执行以下操作:

  1. 创建一个可变局部变量's',其排序与您的 SwiftData 查询相同。
  2. 在该数组上使用 swift move(...) 函数,'s'
  3. 然后在带有索引和项目的 for 循环中使用 's' 上的 enumerated() 函数来设置查询中数据的所有索引。
  4. 保存您的对象。
© www.soinside.com 2019 - 2024. All rights reserved.