【问题标题】:How can I implement onMove in a List of CoreData FetchedResults如何在 CoreData FetchedResults 列表中实现 onMove
【发布时间】:2020-07-09 04:34:09
【问题描述】:

我有一个显示 CoreData FetchedResults 的列表。 我想实现移动行并同时更新实体的 order 属性的可能性。 FetchedResults 不是数组,所以我不能使用数组的 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
        }
    }

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

我认为最好的选择是为Collection where Element: MyEntity, Index == Int 创建一个自定义移动属性。

有什么想法吗?

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

【问题讨论】:

  • 没有更好的主意,非常相似!
  • 这只是在下班后帮助了我!谢谢!类似的代码根本不适合我——对顺序数组进行排序然后用对象数组压缩似乎是解决办法。 UI 仍然是一个小问题,需要刷新,但几乎就在那里! :)

标签: swift core-data swiftui swiftui-list


【解决方案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]!
        }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2017-06-14
    • 2022-07-06
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多