2017-10-10 88 views
0

我正在使用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 
    } 
+0

对记录进行排序我很困惑。这个代码**不会包含更新UI的逻辑('tableView.moveRow ...')。所以你必须更新数据源数组并按照描述重新索引记录。 – vadian

+0

我用一段新的代码更新了我的第一篇文章。此代码允许我直接查看拖动结果,而无需重新加载tableview或再次获取数据。但我不知道,我如何重新索引我的数据对象。你的代码是否适合这种情况? – Ghost108

+0

我在一些需要特定订单的(核心数据)项目中自己使用它。 – vadian

回答

0

如果你需要让你有一个特定的顺序索引保存为核心数据的属性。

重新索引记录的逻辑并不复杂。每当为了改变根据在表格视图中的位置更新index属性并保存例如上下文(假设items是数据源阵列和NSManagedObject亚类有一个属性index):

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

当取数据通过index

+0

也许我觉得它很复杂,但是:我的核心数据“Array”是一个NSManagedObject。每个修改都会直接保存到核心数据中。此刻如果我将一个元素拖到另一行,我将新行号保存到核心数据中,设置其他对象的新行号,再次获取核心数据的数据并重新加载我的表格视图 – Ghost108

+0

您不需要重新获取数据并且不需要重新加载表格视图。您只需更改索引属性并保存上下文。 – vadian

+0

但如果我不重新加载表视图,新订单将如何生效? – Ghost108