NSTableView / NSOutlineView重新加载指定的行

时间:2017-10-11 13:38:30

标签: swift macos cocoa nstableview nsoutlineview

我正在实施拖拽在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)
        )
    }

2 个答案:

答案 0 :(得分:2)

感谢@Willeke的评论,现在行正确更新了:

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

答案 1 :(得分:0)

添加和删除项目看起来不错。

let row = 0
outlineView.removeItems(at: IndexSet(integer: row), inParent: nil, withAnimation: .effectFade)
outlineView.insertItems(at: IndexSet(integer: row), inParent: nil, withAnimation: .effectFade)