2017-10-11 3 views
0

J'applique glisser & déposer/réorganiser dans un NSOutlineView.NSTableView/NSOutlineView recharger les lignes spécifiées

Mes données est comme ceci:

Root 
    Child1 
    Child2 
    Child3 

L'utilisateur sera en mesure de réorganiser les enfants en baisse de glisser &.

Si je reloadData(forRowIndexes:columnIndexes:) dans la méthode de gestion de la goutte, la NSOutlineView ne met pas à jour, tandis qu'un reloadData() simple, fonctionne très bien. Je voulais que mon application soit aussi efficace que possible, alors comment utiliser cette reloadData(forRowIndexes:columnIndexes:)?

Le code correspondant est ici:

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

Ne pas recharger, déplacer (ou retirer et insérer) les rangées. – Willeke

+0

Merci! L'animation pour le mouvement semble trop. J'ai donc fini par utiliser remove et insert. – LShi

Répondre

0

Merci à @ commentaire de Willeke, maintenant les lignes sont correctement mis à jour, par:

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