【问题标题】:save row number in core data and order by desc将行号保存在核心数据中并按 desc 排序
【发布时间】:2018-03-21 21:57:13
【问题描述】:

我正在使用适用于 macOS 的 swift 4,我将核心数据中的数据放入 NSTableview。

现在我想保存我的数据顺序。 示例:

MyCoreData1 (Row 1)
MyCoreData2 (Row 2)
MyCoreData3 (Row 3)
MyCoreData4 (Row 4)

现在我像这样通过拖放对其进行排序:

MyCoreData1 (Row 3)
MyCoreData2 (Row 2)
MyCoreData3 (Row 1)
MyCoreData4 (Row 4)

如何将这个新订单保存到核心数据中? 目前我的实体中有一个属性“sortNumber”

MyCoreData1 (sortNumber 10)
MyCoreData2 (sortNumber 20)
MyCoreData3 (sortNumber 30)
MyCoreData4 (sortNumber 40)

我将按 sortNumber "Desc" 对其进行排序 但是如果我重新排序,我必须构建一个复杂的(我猜会很复杂)逻辑来将每个元素的 sortNumber 更改为新的排序顺序。

你有什么想法我可以解决这个问题吗?

拖动一行代码

func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool {
        let pasteboard = info.draggingPasteboard()
        let pasteboardData = pasteboard.data(forType: NSPasteboard.PasteboardType.string)

        if let pasteboardData = pasteboardData {

            if let rowIndexes = NSKeyedUnarchiver.unarchiveObject(with: pasteboardData) as? IndexSet {
                var oldIndexOffset = 0
                var newIndexOffset = 0

                for oldIndex in rowIndexes {

                    if oldIndex < row {
                        tableView.moveRow(at: oldIndex + oldIndexOffset, to: row - 1)
                        oldIndexOffset -= 1
                    } else {
                        tableView.moveRow(at: oldIndex, to: row + newIndexOffset)
                        newIndexOffset += 1
                    }
                }
            }
        }

        return true
    }

【问题讨论】:

  • 我很困惑。此代码确实包含更新 UI 的逻辑 (tableView.moveRow...)。因此,您必须按照说明更新数据源数组并重新索引记录。
  • 我用新代码更新了我的第一篇文章。此代码允许我直接查看拖动结果,而无需重新加载 tableview 或再次获取数据。但我不知道,如何重新索引我的数据对象。您的代码是否适合这种情况?
  • 我自己在一些需要特定顺序的(核心数据)项目中使用它。
  • 我应该在代码的哪个位置包含您的代码。我尝试了许多“版本”,但它不起作用。我想我做错了
  • 再次:您需要更新数据源数组(以获得与表格视图相同的顺序)。您在使用 Cocoa 绑定吗?然后数据源数组通过 KVC 更新。在这种情况下,在返回 true 之前,在 acceptDrop 方法的末尾运行重新索引代码。

标签: swift macos cocoa core-data nstableview


【解决方案1】:

如果您需要保持特定顺序,您必须将索引保存为 Core Data 中的属性。

重新索引记录的逻辑并不复杂。每当订单更改时,根据表格视图中的位置更新index 属性并保存上下文,例如(假设items 是数据源数组,NSManagedObject 子类有一个属性index):

func reindex()
{
    for (index, item) in items.enumerated() { 
        item.index = Int32(index) 
    }
    saveContext()
}

当您获取数据时,按index 对记录进行排序

【讨论】:

  • 也许我认为它很复杂,但是:我的核心数据“数组”是一个 NSManagedObject。每次修改都会直接保存到核心数据中。目前如果我将一个元素拖到另一行,我将新的行号保存到核心数据中,设置其他对象的新行号,再次获取核心数据的数据并重新加载我的表格视图
  • 您不需要重新获取数据,也不需要重新加载表格视图。您只需要更改索引属性并保存上下文。
  • 但是如果我不重新加载表格视图,新订单将如何生效?
  • 您写的我将一个元素拖到另一行这意味着您已经更改了 UI 中的顺序(以及数据源数组)
  • 好的,因此还不是代码。目前我可以进行拖动操作,但该行不会在 UI 中拖动。我只能检查此操作是否会完成,并根据我的第一条评论执行我的逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
相关资源
最近更新 更多