2017-10-11 11 views
0

Ich implementiere Drag & Drop/Neuordnung in einem NSOutlineView.NSTableView/NSOutlineView neu laden angegebene Zeilen

Meine Daten ist wie folgt:

Root 
    Child1 
    Child2 
    Child3 

Der Benutzer kann die Kinder per Drag & Drop neu anordnen.

Wenn ich reloadData(forRowIndexes:columnIndexes:) in der Methode Umgang mit dem Tropfen, die NSOutlineView nicht aktualisiert, während ein einfaches reloadData() gut funktioniert.

Ich wollte, dass meine App so effizient wie möglich ist, also wie benutzt man diese reloadData(forRowIndexes:columnIndexes:)?

Der zugehörige Code ist hier:

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

nicht nachladen Sie, verschieben (oder entfernen und einfügen) die Reihen. – Willeke

+0

Danke! Die Animation für den Umzug scheint zu viel. So endete ich mit Entfernen und Einfügen. – LShi

Antwort

0

Dank @ Willeke Kommentar, jetzt die Zeilen korrekt aktualisiert werden, durch:

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