我在NSOutlineView中实现了拖放/重排序。
我的数据是这样的:
Root
Child1
Child2
Child3用户将能够通过拖放重新排序子项。
如果我在处理Drop的方法中使用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)
)
}发布于 2017-10-12 13:29:01
多亏了@Willeke的评论,现在行被正确地更新了,通过:
self.outlineView.removeItems(at: IndexSet(integer: oldIndex!),
inParent: oldParent)
self.outlineView.insertItems(at: IndexSet(integer: newIndex),
inParent: oldParent)发布于 2018-11-07 23:18:11
添加和删除项目似乎没问题。
let row = 0
outlineView.removeItems(at: IndexSet(integer: row), inParent: nil, withAnimation: .effectFade)
outlineView.insertItems(at: IndexSet(integer: row), inParent: nil, withAnimation: .effectFade)https://stackoverflow.com/questions/46689701
复制相似问题