保存核心数据中的行号并通过desc排序
问题描述:
我正在使用swift 4 for macOS,并将我的数据从核心数据转换为NSTableview。保存核心数据中的行号并通过desc排序
现在我想保存我的数据的顺序。 例子:
MyCoreData1 (Row 1)
MyCoreData2 (Row 2)
MyCoreData3 (Row 3)
MyCoreData4 (Row 4)
现在我拖排序并丢弃这样的:
MyCoreData1 (Row 3)
MyCoreData2 (Row 2)
MyCoreData3 (Row 1)
MyCoreData4 (Row 4)
我如何保存这个新秩序的核心到数据? 此刻我在实体
MyCoreData1 (sortNumber 10)
MyCoreData2 (sortNumber 20)
MyCoreData3 (sortNumber 30)
MyCoreData4 (sortNumber 40)
有一个属性“sortNumber”我会通过sortNumber“说明” 排序,但如果我重新梳理它,我必须建立一个复杂的(我猜将是复杂的)逻辑,将每个元素的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
}
答
如果你需要让你有一个特定的顺序索引保存为核心数据的属性。
重新索引记录的逻辑并不复杂。每当为了改变根据在表格视图中的位置更新index
属性并保存例如上下文(假设items
是数据源阵列和NSManagedObject
亚类有一个属性index
):
func reindex()
{
for (index, item) in items.enumerated() {
item.index = Int32(index)
}
saveContext()
}
当取数据通过index
对记录进行排序我很困惑。这个代码**不会包含更新UI的逻辑('tableView.moveRow ...')。所以你必须更新数据源数组并按照描述重新索引记录。 – vadian
我用一段新的代码更新了我的第一篇文章。此代码允许我直接查看拖动结果,而无需重新加载tableview或再次获取数据。但我不知道,我如何重新索引我的数据对象。你的代码是否适合这种情况? – Ghost108
我在一些需要特定订单的(核心数据)项目中自己使用它。 – vadian