2017-10-11 70 views
0

我正在實施拖動&刪除/重新排序在NSOutlineViewNSTableView/NSOutlineView重新加載指定的行

我的數據是這樣的:

Root 
    Child1 
    Child2 
    Child3 

用戶將可以通過拖放&下降到重新排序的孩子們。

如果我使用reloadData(forRowIndexes:columnIndexes:)的方法處理的下降, 的NSOutlineView不更新,而一個簡單的reloadData()工作正常。

我希望我的應用程序儘可能高效,因此如何使用此reloadData(forRowIndexes:columnIndexes:)

相關的代碼是在這裏:

info.enumerateDraggingItems(
     options: .clearNonenumeratedImages, 
     for: self.outlineView, 
     classes: classes, 
     searchOptions: [:]) 
    { [unowned self] (
     draggingItem: NSDraggingItem, 
     idx, 
     stop) -> Void in 
     let dragged = self.currentlyDraggedObjects![idx] as! RowItem 
     let oldParent = dragged.parent! 
     let siblings = oldParent.children 

     let oldIndex = siblings?.index(where: { (item) -> Bool in 
      item.identifier == dragged.identifier 
     }) 

     oldParent.moveChild(from: oldIndex!, to: insertionPos) 

     let parentRow = self.outlineView.row(forItem: item) 

     let reloadRowRange = oldIndex! < insertionPos ? 
      (oldIndex! + parentRow + 1)...(insertionPos + parentRow + 1) 
      : (insertionPos + parentRow + 1)...(oldIndex! + parentRow + 1) 

     #if DEBUG 
      print(#file, #line, reloadRowRange) 
     #endif 

     // self.outlineView.reloadData() // This works! 

     // Doesn't work, why? 
     self.outlineView.reloadData(
      forRowIndexes: IndexSet(reloadRowRange), 
      columnIndexes: IndexSet(integer: 0) 
     ) 
    } 
+1

不要重裝,移動(或刪除和插入)行。 – Willeke

+0

謝謝!移動的動畫似乎太多了。所以我結束了使用刪除和插入。 – LShi

回答

0

感謝@ Willeke的評論,現在行正確更新,方法是:

self.outlineView.removeItems(at: IndexSet(integer: oldIndex!), 
              inParent: oldParent) 
self.outlineView.insertItems(at: IndexSet(integer: newIndex), 
              inParent: oldParent)