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)
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |