0
私はNSOutlineView
にドラッグ&ドロップ/並べ替えを実装しています。NSTableView/NSOutlineView指定された行をリロード
私のデータは、このようなものです:
Root
Child1
Child2
Child3
ユーザーがドラッグ&ドロップで子供を並べ替えることができるようになります。
ドロップを処理するメソッドでreloadData(forRowIndexes:columnIndexes:)
を使用すると、reloadData()
が正常に動作しますが、 NSOutlineView
は更新されません。
アプリをできるだけ効率的にしたいので、このreloadData(forRowIndexes:columnIndexes:)
の使い方は?
関連するコードはここにある:Willekeさんのコメント@に
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)
)
}
行。 – Willeke
ありがとう!動きのアニメーションがあまりにも多く見えます。だから私は削除と挿入を使用して終了しました。 – LShi