【发布时间】: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