我正在使用swift 4 for macOS,我将核心数据中的数据转换为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
}
答案 0 :(得分:0)
如果您需要保留特定订单,则必须将索引另存为Core Data中的属性。
重新索引记录的逻辑并不复杂。每当订单更改时,根据表视图中的位置更新index
属性并保存上下文(例如假设items
是数据源数组,NSManagedObject
子类具有属性{ {1}}):
index
获取数据时,按func reindex()
{
for (index, item) in items.enumerated() {
item.index = Int32(index)
}
saveContext()
}