如何在 CoreData FetchedResults 列表中实现 onMove

Lor*_*ngo 5 core-data swift swiftui swiftui-list

我有一个显示 CoreData FetchedResults 的列表。我想实现移动行的可能性,同时更新实体的订单属性。FetchedResults 不是数组,所以我不能使用 Array 的 move 属性。这就是我实施的方式,但效果不佳。

func move(fromOffsets: IndexSet, toOffset: Int) {
        var orders: [Int16] = Array(1...Int16(myEntities.count))
        orders.move(fromOffsets: fromOffsets, toOffset: toOffset)
        for (entity, order) in zip(myEntities, orders) {
            entity.order = order
        }
    }
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我得到了一个当前订单的数组,我执行了移动,然后重新分配了它们。

我认为最好的选择是为Collection where Element: MyEntity, Index == Int.

任何的想法?

要重新创建场景,您可以在选择 CoreData 选项的情况下轻松启动新的 SwiftUI Master-Detail 项目,然后只需将 order 属性添加到实体(记住对@FetchRequestwith进行排序NSSortDescriptor(keyPath: \MyEntity.order, ascending: true)]

小智 1

我发现它只需要一些调整:

///example: source = 1, destination = 4
///original list: [a,b,c,d,e]
///final list: [b,c,d,a,e]
func move(from source: IndexSet, to destination: Int)
         var sortedOrders: [Int16] = Array(1...Int16(myEntities.count))
        for (entity, order) in zip(myEntities, sortedOrders) {
            entity.order = order
        }
        
        sortedOrders.move(fromOffsets: source, toOffset: destination)
        var finalOrders : [Int16] = Array(1...Int16(myEntities.count))
        var mappingDict = Dictionary(uniqueKeysWithValues: zip(sortedOrders , finalOrders ) )
        // [5: 5, 4: 3, 2: 1, 1: 4, 3: 2]
        
        for entity in myEntities{
            entity.order = mappingDict[entity.order]!
        }

}
Run Code Online (Sandbox Code Playgroud)